Script 1 for Kitchel et al.Ā 2023 in prep taxonomic diversity manuscript.

library(tidyverse)
library(sp)
library(raster)
#library(rgeos)
library(rgbif)
library(viridis)
library(gridExtra)
library(rasterVis)
library(concaveman)
library(sf)
library(cowplot)
library(data.table)
set.seed(1)

Pull in compiled and cleaned data from FishGlob downloaded on November 28 2022 (V 1.5). This is typically compiled by Dr.Ā Aurore Maureaud. This includes public and private data and therefore link cannot be shared. However with editing you can run analyses for public trawl surveys.

Survey code Survey name short Survey name long Agency Region Access Provider/link to access Inclusion
AI Aleutian Islands Aleutian Islands National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
BITS-1 Baltic Sea Q1 Baltic Sea Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
BITS-4 Baltic Sea Q4 Baltic Sea Quarter 4 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
CHL Chile Chile Universidad de Concepción, Chile South America Requires data request Daniela Yepson and Luis Cubillos Included
COL Colombia Colombian Caribbean Universidad Nacional de Colombia South America Requires data request Camilo B. Garcia Too few years
DFO-HS Hecate Strait Hecate Strait Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/780a1c02-1f9c-4994-bc70-a0e9ef8e3968 and OceanAdapt: https://zenodo.org/records/8103080 Too few years
DFO-NF Newfoundland Newfoundland Department of Fisheries and Oceans Canada Requires data request Mariano Koen-Alonso Included
DFO-QCS Queen Charlotte Sound Queen Charlotte Sound Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/a278d1af-d567-4964-a109-ae1e84cbd24a and OceanAdapt: https://zenodo.org/records/8103080 Included
DFO-SOG Strait of Georgia Straight of Georgia Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/d880ba18-8790-41a2-bf73-e9247380759b and OceanAdapt: https://zenodo.org/records/8103080 Too few years
DFO-WCHG West Coast Haida Gwaii West Coast Haida Gwaii Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/5ee30758-b1d6-49fe-8c4e-5136f4b39ad1 and OceanAdapt: https://zenodo.org/records/8103080 Too few years
DFO-WCVI West Coast Vancouver Island West Coast Vancouver Island Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/557e42ae-06fe-426d-8242-c3107670b1de and OceanAdapt: https://zenodo.org/records/8103080 Too few years
EBS Eastern Bering Sea Eastern Bering Sea National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
EVHOE Bay of Biscay Bay of Biscay International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
FALK Falkland Islands Falkland Islands Falkland Islands Fisheries Department Southern Ocean Requires data request Alexander Arkhipkin and Jorge Ramos Excluded after spatial temporal standardization in next script
FR-CGFS English Channel English Channel International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
GIN Guinea Guinea National Center of Fisheries Sciences of Boussoura, Conakry, Republic of Guinea Africa Requires data request Mohammed Lamine Camara Inconsistent sampling through space and time
GMEX-Summer Gulf of Mexico Summer Gulf of Mexico Summer National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
GMEX-Fall Gulf of Mexico Fall Gulf of Mexico Fall National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
GOA Gulf of Alaska Gulf of Alaska National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
GRL-DE Greenland Greenland Thuenen Institute of Sea Fisheries Europe Requires data request Karl-Michael Werner Included
GSL-N N Gulf of St.Ā Lawrence Northern Gulf of St.Ā Lawrence Department of Fisheries and Oceans Canada Public See OceanAdapt: https://zenodo.org/records/8103080 for specific DFO links Included
GSL-S S Gulf of St.Ā Lawrence Southern Gulf of St.Ā Lawrence Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/1989de32-bc5d-c696-879c-54d422438e64 and OceanAdapt: https://zenodo.org/records/8103080 Included
ICE-GFS Iceland Iceland Marine and Freshwater Research Institute, Iceland Europe Requires data request Jón Sólmundsson Included
IE-IGFS Irish Sea Irish Sea International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
IS-TAU Israel Israel Tel Aviv University Asia Requires data request Jonathan Belmaker Too few years
IS-MOAG Israel Israel Israeli Ministry of Agriculture Asia Requires data request Oren Sonin and Dori Edelist Inconsistent sampling through space and time
MEDITS Mediterranean Mediterranean Multiple Europe Requires data request Contact corresponding author for contacts Included
MRT Mauritania Mauritania Institut Mauritanien de Recherches Océanographiques et des Pêches, Nouadhibou, Mauritania Africa Requires data request Beyah Meissa Inconsistent sampling through space and time
NAM Namibia Namibia National Marine Information and Research Centre, Ministry of Fisheries and Marine Resources, Namibia Africa Requires data request Johannes Kathena Included
NEUS-Fall NE US Fall Northeast USA Fall National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
NEUS-Spring NE US Spring Northeast USA Spring National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
NIGFS-1 N Ireland Q1 North Ireland Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NIGFS-4 N Ireland Q4 North Ireland Quarter 4 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
Nor-BTS-3 Barents Sea Norway Q3 Barents Sea Norway Q3 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NS-IBTS-1 N Sea Q1 North Sea Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NS-IBTS-3 N Sea Q3 North Sea Quarter 3 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
NZ-CHAT Chatham Rise NZ Chatham Rise New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
NZ-ECSI E Coast S Island NZ East Coast South Island New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
NZ-SUBA Sub-Antarctic NZ Sub-Antarctic New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
NZ-WCSI W Coast S Island NZ West Coast South Island New Zealand National Institute of Water and Atmospheric Research Limited, New Zealand Oceania Requires data request Richard O’Driscoll and Fabrice Stephenson Included
PT-IBTS Portugal Portugal International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
ROCKALL Rockall Plateau Rockall Plateau International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
S-GEORG S Georgia South Georgia British Antarctic Survey Southern Ocean Requires data request Mark Belchier and Martin Collins Included
SCS-Fall Scotian Shelf Fall Scotian Shelf Summer Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/1366e1f1-e2c8-4905-89ae-e10f1be0a164 and OceanAdapt: https://zenodo.org/records/8103080 Too few years
SCS-SPRING Scotian Shelf Spring Scotian Shelf Spring Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/fecf045a-95a2-4b69-8a40-818649a62716 and OceanAdapt: https://zenodo.org/records/8103080 Too much data loss after spatial temporal standardization
SCS-SUMMER Scotian Shelf Summer Scotian Shelf Summer Department of Fisheries and Oceans Canada Public https://open.canada.ca/data/en/dataset/1366e1f1-e2c8-4905-89ae-e10f1be0a164 and OceanAdapt: https://zenodo.org/records/8103080 Included
SEUS-fall SE US Fall Southeast USA Fall National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
SEUS-spring SE US Spring Southeast USA Spring National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
SEUS-summer SE US Summer Southeast USA Summer National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
SWC-IBTS-1 Scotland Shelf Sea Q1 Scotland Shelf Sea Quarter 1 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
SWC-IBTS-4 Scotland Shelf Sea Q4 Scotland Shelf Sea Quarter 4 International Council for the Exploration of the Sea Europe Public https://datras.ices.dk/Data_products/Download/Download_Data_public.aspx Included
WBLS Western Black Sea Western Black Sea Institute of Fish Resources, Bulgaria Europe Requires data request Elitsa Petrova (), Feriha Tserkova & Vesselina Mihneva Too few years
WCANN W Coast US West Coast USA National Oceanic and Atmospheric Administration USA Public DisMAP: https://apps-st.fisheries.noaa.gov/dismap/ and OceanAdapt: https://zenodo.org/records/8103080 Included
ZAF-ATL Atlantic Ocean ZA Atlantic Ocean South Africa Department of Forestry, Fisheries and the Environment, South Africa Africa Requires data request Tracey Fairweather Included
ZAF-IND Indian Ocean ZA Indian Ocean South Africa Department of Forestry, Fisheries and the Environment, South Africa Africa Requires data request Tracey Fairweather Included

FishGlob_1.5 <- fread(here::here("data","FISHGLOB_v1.5_clean.csv"))
|--------------------------------------------------|
|==================================================|
|--------------------------------------------------|
|==================================================|

This version of FishGlob leaves out seasons for GMEX, fix here

#add season to GMEX to survey unit

FishGlob_1.5[survey == "GMEX", survey_unit := paste0(survey,"-",season)]

Also adding in seasons for NIGFS

#add season to GMEX to survey unit

FishGlob_1.5[survey == "NIGFS", survey_unit := paste0(survey,"-",quarter)]

ZAF (South Africa) has distinct Atlantic and Indian surveys (split at ~20.01˚ E, Cape Agulhas)

FishGlob_1.5[survey == "ZAF" & longitude <20.01, survey_unit := "ZAF-ATL"][survey == "ZAF" & longitude >= 20.01, survey_unit := "ZAF-IND"]

Region names

sort(unique(FishGlob_1.5[,survey_unit]))
 [1] "AI"          "BITS-1"      "BITS-4"      "CHL"         "COL"         "DFO-HS"      "DFO-NF"      "DFO-QCS"     "DFO-SOG"     "DFO-WCHG"    "DFO-WCVI"    "EBS"         "EVHOE"       "FALK"       
[15] "FR-CGFS"     "GIN"         "GMEX-Fall"   "GMEX-Summer" "GOA"         "GRL-DE"      "GSL-N"       "GSL-S"       "ICE-GFS"     "IE-IGFS"     "IS-MOAG"     "IS-TAU"      "MEDITS"      "MRT"        
[29] norway_clean "NEUS-Fall"   "NEUS-Spring" "NIGFS-1"     "NIGFS-4"     "Nor-BTS"     "NS-IBTS-1"   "NS-IBTS-3"   "NZ-CHAT"     "NZ-ECSI"     "NZ-SUBA"     "NZ-WCSI"     "PT-IBTS"     "ROCKALL"    
[43] "S-GEORG"     "SCS-FALL"    "SCS-SPRING"  "SCS-SUMMER"  "SEUS-fall"   "SEUS-spring" "SEUS-summer" "SWC-IBTS-1"  "SWC-IBTS-4"  "WBLS"        "WCANN"       "WCTRI"       "ZAF"         "ZAF-ATL"    
[57] "ZAF-IND"    

##Data Replacements ####Greenland (version in FishGlob 1.5 is missing lengths and therefore biomass values) This version was obtained directly from Karl-Michael Werner karl-michael.werner@thuenen.de who now manages the Greenland survey September 2023. He is based in Germany.

#greenland <- 

####Norway Prepped by Laurene Pecuchet (U Trƶmso, Norway) September 2023 to replace what’s in FishGlob 1.5 because IMR ā€œare quite concerned that FishGlob, and other studies, have been using aā€flawedā€ multi-surveys dataset that is available in NMDC (data portal of IMR). Turns out that this dataset was put publicly by miscommunication on NMDC after one published paper in Scientific Reports, and I think they only realized the existence of this dataset just the last year as some papers are coming out using it (especially the one from Cesc Gordo-Vilaseca in PNAS https://www.pnas.org/doi/10.1073/pnas.2120869120). They are now trying to make some damage controls to make sure that this dataset is not used ever again in the future, but that cleanded and standardised datasets of the Barents Sea survey that are publicly available in NMDC are used instead of.

September 14: From Laurene, ā€œI send you in attachment the ā€œnewā€ IMR survey formatted for Fishglob. I have done some small check of the dataset, and so far everything looks good, but I didn’t do a deep check yet, but I don’t see why there should be any problems with it….For your study, I think it is also important that you know that there has been some inconsistencies in taxonomic descriptions in the Barents Sea so that some species should be considered at the genus level instead of for biodiversity analysis, I send you in attach an excel (Barents Sea Fish Reference List.csv) file that summarize which species might be a misidentification and which one should be considered and merged.ā€ All of these files now live in ā€œdata/Norway_Sep2023ā€

Helpful guidance from here: https://www.hi.no/en/hi/nettrapporter/rapport-fra-havforskningen-en-2021-15 - ā€œ2.2.5 - Recommended adjustments to the output before analysis Eelpouts and liparids. When combing years, we recommend that all records of eelpouts (Zoarcidae) are pooled to the family level, because they are notoriously difficult to identify (see Appendix 3). The same apply to liparids (Liparidae). If species level data of these families are used, consider excluding data from 2004-2006/2007. These years the staff on some of the Norwegian vessels were inexperienced, and proper identification keys for arctic species were lacking (compare for instance catches of Lycodes frigidus and Lycodes eudipleurostictus in the first years to the later years, Appendix 3). If species level data of these families are used, records to family levels should be removed or else these will be treated as a separate species in the further analysis of the data. Both Zoarcidae and Liparidae have unresolved taxonomy for some genera, therefore we have chosen to pool all liparids of the genus Careproctus and all eelpouts of the genus Gymnelus in the output. Sebastes. The columnā€ Sebastes spp.ā€ contains mainly juvenile redfish. Small specimens are very difficult to identify so the protocol is to identify only individuals larger than 10 cm to the species level. Before analysis, all redfish ( S . mentella , S. norvegicus, S. viviparus and Sebastes spp .) should be pooled, or Sebastes spp. should be removed – if not it will be treated as a separate species in the analysis . Records in Appendix 2. The records of the S. viviparus west of Svalbard(Spitsbergen) are unreliable and should be removed if Sebastes data are kept at the species level (Appendix 2). Species verified for the Barents Sea, but outliers in terms the normal depth range, distribution area within the Barents Sea, size etc. were coded as questionable in the data base (Appendix 2) and should be removed before analysis. Consider also removing pelagic species (e.g.Ā capelin and herring), as these are poorly sampled by the bottom trawl. The data should be standardised with towing distance before analysis.ā€

Therefore, we will: - Remove all records of eelpouts and liparids (Family = Zoarcidae or Liparidae) (as we only include species ID’d to species) - Remove redfish (Genus = Sebastes)


#load Norwegian data
load(here::here("data","Norway_Sep2023","NOR-BTS_clean.RData"))
norway_clean <- data.table(data)

#remove observations without dates
norway_clean <- norway_clean[complete.cases(norway_clean[,.(month)]),]

#remove species records in accordance with recommendation from HI
norway_clean <- norway_clean[!(family %in% c("Zoarcidae","Liparidae") | genus == "Sebastes"),]

#some column names don't match fishglob (fishglob = num, num_h, num_cpue, wgt, wgt_h, wgt_cpue; norway = num, num_cpue (number of ind./hour), num_cpua (number of ind./km2), wgt, wgt_cpue (kg/min), wgt_cpua(kg/km2)  )
#also, some column units in the readme are in correct. Therefore, I will generate _cpue and _h values here
# we will need to check  and rename columns
setnames(norway_clean, c("haul_dur"), c("haul_dur_m"))
norway_clean[,haul_dur := haul_dur_m/60] #haul duration currently in minutes, need hours
norway_clean[,num_h := num/haul_dur][,num_cpue := num/area_swept][,wgt_h := wgt/haul_dur][,wgt_cpue := wgt/area_swept]

#change some columns to numeric
cols = c("month","day")
norway_clean[,(cols) := lapply(.SD,as.numeric),.SDcols = cols]

#also, delete source and timestamp
fishglob_colnames <- colnames(FishGlob_1.5)
norway_clean <- norway_clean[,..fishglob_colnames]

norway_clean[survey == "Nor-BTS" & month %in% c(1:6), survey_unit := "Nor-BTS-1"][survey == "Nor-BTS" & month %in% c(7:12), survey_unit := "Nor-BTS-3"]

#Overlap between IBTS and Nor-BTS surveys below 62˚latitude, so delete all hauls that occur below 62˚latitude
norway_clean <- norway_clean[latitude  >= 62,]

Delete Greenland and Norway

FishGlob_1.5 <- FishGlob_1.5[!(survey %in% c("Nor-BTS"
                                             #,
                                             #"GRL-DE" #ignore greenland for now...
                                             ))]

Add in updated Greenland and Norway data

FishGlob_1.5 <-rbind(FishGlob_1.5,norway_clean)
#FishGlob_1.5 <-rbind(FishGlob_1.5,greenland)

##Preliminary Data Cuts ###Specific Regional Changes Before Cutting to 10 years only

GSL - North: we have data 1980-2019, but gear changes in 2004/2005, so let’s use later portion (more consistent months of sampling; 2005-2019; 15 years) - South: we have data 1970-2019, but gear/vessel changes in 1985 and again in 1992, so again let’s use later portion (1992-2019; 27 years) - See this github issue

#identify haul_ids of hauls we should remove from GSL surveys
haul_ids_to_remove_GSL <- unique(FishGlob_1.5[(survey == "GSL-N" & year < 2005)|(survey == "GSL-S" & year < 1992),haul_id])

FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_GSL),] #remove hauls before consistent gear/vessel was used

SGEORG - From Martin Collins, ā€œMost surveys were focused on demersal fish on the South Georgia shelf (< 350 m), but surveys in 2003, 2010 and 2019 had some deeper trawls. The deeper trawls caught very different fish, so are unlikely to be of use to a long-term analysis, but I have left them in.ā€

-Delete all trawls deeper than 350 M

#identify haul_ids of hauls we should remove from GSL surveys
haul_ids_to_remove_SGEORG <- unique(FishGlob_1.5[(survey == "SGEORG" & depth >350),haul_id])

FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_SGEORG),] #remove hauls before consistent gear/vessel was used

NZ-CHAT -bump december observations to next year because observations occur in 12,1,2

#bump observations forward
FishGlob_1.5[survey == "NZ-CHAT" & month == 12,  year := year+1, ]

###Because time is an essential component of these analyses, we will get rid of any survey x season combinations that are not sampled for at least 10 years

#new row for total number of years sampled
FishGlob_1.5[,years_sampled := length(unique(year)),.(survey_unit)]

summary(FishGlob_1.5$years_sampled) #ranges from 2 (DFO Straight of Georgia) to 57 (Northeast US)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00   23.00   29.00   30.89   37.00   57.00 
View(unique(FishGlob_1.5[,.(survey_unit, years_sampled)]))

#statistics about full dataset
nrow(FishGlob_1.5) 
[1] 4172996
length(unique(FishGlob_1.5[,survey])) 
[1] 45
length(unique(FishGlob_1.5[,survey_unit])) 
[1] 57
#remove observations for any regions x season combinations sampled less than 10 times
FishGlob.10year <- FishGlob_1.5[years_sampled >= 10,]

#statistics about reduced 10 year dataset
nrow(FishGlob.10year) 
[1] 4089112
length(unique(FishGlob.10year[,survey])) 
[1] 38
length(unique(FishGlob.10year[,as.character(survey_unit)])) 
[1] 48
#remove full database
rm(FishGlob_1.5)

###For taxonomic analyses, resolution to species is required. Therefore, we will exclude any observations not resolved to species.

#month a number
FishGlob.10year[,month := as.numeric(month)]

FishGlob.10year.spp <- FishGlob.10year[rank %in% c("Species", "Subspecies"),] #3869384 total observations

#remove full species database
rm(FishGlob.10year)

#vector with all survey names
all_survey_units <- sort(unique(FishGlob.10year.spp[,survey_unit]))

#calculate # species per year
FishGlob.10year.spp_survey_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, accepted_name)])

FishGlob.10year.spp_survey_year[,spp_count_survey_year := uniqueN(accepted_name),.(survey_unit, year)]

FishGlob.10year.spp_survey_year.r <-unique(FishGlob.10year.spp_survey_year[,.(survey_unit,  year, spp_count_survey_year)])

nrow(FishGlob.10year.spp_survey_year.r)
[1] 1215
#calculate # hauls per year
FishGlob.10year.spp_haulid_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, haul_id)])

FishGlob.10year.spp_haulid_year[,haulid_count_survey_year := uniqueN(haul_id),.(survey_unit, year)]

FishGlob.10year.spp_haulid_year.r <-unique(FishGlob.10year.spp_haulid_year[,.(survey_unit,  year, haulid_count_survey_year)])

nrow(FishGlob.10year.spp_haulid_year.r)
[1] 1215

##Visually Inspect Distribution of Data Through Time and Space

##Spatial and Temporal Patterns in All Trawl Surveys

Let’s look at the number of hauls per year/month and year/quarter and year/season visually

#unique survey, survey_unit, year, month, quarter, season, haul_id, lat, lon
FishGlob.10year.uniquehauls <- unique(FishGlob.10year.spp[,.(survey, survey_unit, year,month,quarter,season,haul_id, latitude, longitude,haul_dur)])

#add column with adjusted longitude for few surveys that cross dateline (NZ-CHAT and AI)
FishGlob.10year.uniquehauls[,longitude_adj := ifelse((survey_unit %in% c("AI","NZ-CHAT") & longitude > 0),longitude-360,longitude)]

FishGlob.10year.uniquehauls[,haul_counts_per_survey_season_month :=uniqueN(haul_id),.(survey, month, season)][, #count # hauls per survey, season, and month
                     haul_counts_per_survey_quarter_month :=uniqueN(haul_id),.(survey, month, quarter)][,#count # hauls per survey, month, and quarter
                     total_hauls_survey :=uniqueN(haul_id),.(survey)][,#count # hauls per survey in all years
                                                        
              #proportion of hauls for each survey, season, and month divided by total # over all years
                     haul_proportion_survey_season :=haul_counts_per_survey_season_month/total_hauls_survey][,
              #proportion of hauls for each survey, quarter, and month divided by total # over all years
                     haul_proportion_survey_quarter :=haul_counts_per_survey_quarter_month/total_hauls_survey][,
                                                                                                               
                     haul_count_per_survey_year_month :=uniqueN(haul_id),.(year, survey_unit, month)][, #count # hauls per survey unit, year, and month
                     total_hauls_survey_year := uniqueN(haul_id),.(survey_unit,year)][, #count total # hauls per survey unit and year
                     #proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
                     haul_proportion_month_yearly := haul_count_per_survey_year_month/total_hauls_survey_year][, 

                     haul_count_per_survey_year_quarter :=uniqueN(haul_id),.(year, survey_unit, quarter)][, #count # hauls per survey unit, year, and month
                     #proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
                     haul_proportion_quarter_yearly := haul_count_per_survey_year_quarter/total_hauls_survey_year] 

FishGlob.10year.uniquehauls.season <- unique(FishGlob.10year.uniquehauls[,.(survey, survey_unit, month, season, haul_counts_per_survey_season_month,total_hauls_survey, haul_proportion_survey_season)]) #relative sampling by season across all years

FishGlob.10year.uniquehauls.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey,survey_unit , month, quarter, haul_counts_per_survey_quarter_month,total_hauls_survey, haul_proportion_survey_quarter)]) #relative sampling by quarter across all years

FishGlob.10year.uniquehauls.annual.month <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, month, haul_count_per_survey_year_month,total_hauls_survey_year,haul_proportion_month_yearly)]) #relative sampling by month within years

FishGlob.10year.uniquehauls.annual.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, quarter, haul_count_per_survey_year_quarter,total_hauls_survey_year,haul_proportion_quarter_yearly)]) #relative sampling by month within years

#how does #hauls vary with season and month?
survey_season_month_hauls <- ggplot(FishGlob.10year.uniquehauls.season) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  facet_wrap(~survey,scales = "free_y") +
  theme_classic()

ggsave(survey_season_month_hauls, filename = "survey_season_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")

#how does #hauls vary with quarter and month?
survey_quarter_month_hauls <- ggplot(FishGlob.10year.uniquehauls.quarter) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  facet_wrap(~survey,scales = "free_y") +
  theme_classic()

ggsave(survey_quarter_month_hauls, filename = "survey_quarter_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")

#how does #hauls vary with year and month?
year_survey_month_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.month) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  facet_wrap(~survey_unit,scales = "free_y") +
  theme_classic()

ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")

#how does #hauls vary with year and month?
year_survey_quarter_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.quarter) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  facet_wrap(~survey_unit,scales = "free_y") +
  theme_classic()

ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")

Now, let’s look at how location of sampling varies by month of sampling and year of sampling

location_by_year <- ggplot(FishGlob.10year.uniquehauls) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  facet_wrap(~survey_unit, scales = "free") +
  theme_classic()

ggsave(location_by_year, filename = "location_by_year.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_year, filename = "location_by_year.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_year, filename = "location_by_year.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
(location_by_month <- ggplot(FishGlob.10year.uniquehauls) +
  geom_point(aes(x = longitude_adj, y = latitude, color = as.numeric(month)), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  facet_wrap(~survey_unit, scales = "free") +
  theme_classic())

ggsave(location_by_month, filename = "location_by_month.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_month, filename = "location_by_month.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_month, filename = "location_by_month.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

##Region Specific Data Processing

-Fredston et al.Ā 2022 Nature and Batt et al.Ā 2017 Ecology Letters informed North American data processing -Personal communication with Aurore Maureaud and Laurene Pecuchet re: work by A. Maureaud, L. Pecuchet and R. Frelat and the supplementary material for Maureaud et al.Ā 2019 Proceedings of the Royal Society B: Biological Sciences informed European data processing -Additional data processing informed by data itself, and by FishGlob pdf summary documents -limit to max 3 months for each survey unit, representative of a ā€˜season’ (exception = West Coast USA where all 4 months sampled consistently)

####ā€œAIā€

ggplot(FishGlob.10year.uniquehauls.season[survey == "AI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey == "AI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey == "AI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey == "AI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "AI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "AI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

ai_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "AI" & month %in% c(6:8),haul_id])

####BITS (We have two surveys for BITS, quarter 1 and quarter 4) BITS 1

From Fredston et al.Ā 2023, every year after 2000 has >400 hauls and most of the earlier years are <50

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep both months (2,3) -Seemingly consistent spatial distribution through time -Consistent # of species and # hauls after 2000

bits1_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-1" & month %in% c(2,3) & year > 2000,haul_id])

BITS4

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Start in 2000 (starts in 1996, but gap in 1997 and 1998, and 1996 all in December; also spp richness in first survey very low; consistent # of hauls after 2000) -Seemingly consistent spatial distribution through time

bits4_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-4" & month %in% c(10:12) & year > 2000,haul_id])

####CHL (Chile)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "CHL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "CHL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "CHL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "CHL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "CHL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "CHL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (7,8,9) -Seemingly consistent spatial distribution through time -No major changes in spp richness through time -No major changes in # hauls through time

chl_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "CHL" & month %in% c(7:9),haul_id])

####DFO-NF

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-NF",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-NF",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through time -No major changes in spp richness through time -No major changes in haulid through time

dfo_nf_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF" & month %in% c(10:12),haul_id])

####DFO-QCS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (7,8) -Seemingly consistent spatial distribution through time -No major changes in richness over time -No major changes in #hauls

dfo_qcs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS" & month %in% c(7,8),haul_id])

####EBS

-Sampling years prior to 1984 (data begin in 1982) were excluded from analysis due to large apparent increases in the number of species recorded in the first two years. (Batt et al.Ā 2017)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EBS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EBS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EBS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EBS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EBS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EBS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (6,7,8) -Seemingly consistent spatial distribution through time -Per Batt et al.Ā 2017, limit to >= 1984 -No clear changes in richness through time -No clear changes in # hauls through time

ebs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EBS" & month %in% c(6,7,8) & year >= 1984,haul_id])

####EVHOE

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EVHOE",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EVHOE",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through time -Very low sampling in 2017 (and also low richness), exclude this year

evhoe_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EVHOE" & month %in% c(10,11,12) & year != 2017 ,haul_id])

####FALK (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FALK",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FALK",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FALK",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FALK",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FALK",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FALK",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep February (2) only from 2004 onward (most consistent sampling) -Inconsistent spatial distribution through time, but this will be fixed in next step with spatial standardization

falk_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FALK" & month %in% c(2) & year >= 2004, haul_id])

####FR-CGFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 -Consistent spatial distribution through time -Seemingly consistent richness through time -Seeemingly consistent #hauls through time

fr_cgfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS" & month %in% c(9,10,11), haul_id])

####GIN (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GIN",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GIN",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GIN",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GIN",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GIN",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GIN",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Exclude this region, no consistent sampling through time

gin_hauls_keep <- NULL

####GMEX -In the Gulf of Mexico, we restricted our analysis to data from 1984 - 2000 (full range 1982-2014); if all years had been used, the number of sites sampled in at least 85% of years would drop from 39 to 13. (Batt et al.Ā 2017)

GMEX Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 -Inconsistent spatial distribution through time, will restrict to <-87.5 longitude -Seemingly consistent richness through time -Seeemingly consistent #hauls through time

gmex_fall_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall" & month %in% c(9,10,11) & longitude_adj < -87.5, haul_id])

GMEX Summer

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep months 5,6,7 -In consistent spatial distribution through time, but this will be fixed in spatial standardization step -Seemingly consistent richness before 2008 and 2008 onward through time -Seeemingly consistent #hauls through time -Jump from 2007 to 2008, when spatial footprint increases, so I will only use data from before 2008

gmex_summer_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer" & month %in% c(5,6,7) & year <2008, haul_id])

####GOA

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GOA",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GOA",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GOA",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GOA",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GOA",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GOA",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep months 6,7,8 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent #hauls through time

goa_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GOA" & month %in% c(6,7,8), haul_id])

####GRL-DE -From Beukhof et al.Ā 2019, all surveys in October and November

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GRL-DE",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GRL-DE",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-No months in data set, but according to Beukhof et al.Ā 2019, all sampling in October and November so keep all -Consistent spatial distribution through time -Seemingly consistent richness -# of hauls drops between 1991 and 1992, and both 1992 and 2017 so limit to years between (1993-2016)

grl_de_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE" & year %in% c(1993:2016), haul_id])

####GSL

GSL-N

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-N",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-N",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 6,7,8 -Consistent spatial distribution through time -Seemingly consistent richness -# of hauls in 2005 is higher, so start in 2006

gsl_n_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-N" & year > 2005, haul_id])

GSL-S

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-S",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-S",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 8,9,10 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

gsl_s_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-S" & month %in% c(8:10), haul_id])

####ICE-GFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 2,3,4 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

ice_gfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS" & month %in% c(2:4), haul_id])

####IE-IGFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 10,11,12 -Consistent spatial distribution through time after 2004 (sampled far east in 2003 and 2004) -Seemingly consistent richness -Seemingly consistent number of hauls

ie_igfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS" & month %in% c(10:12) & year  > 2004, haul_id])

####IS-MOAG (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Sampling too scattered over time, excluding

is_moag_hauls_keep <- NULL

####MEDITS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MEDITS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MEDITS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep all surveys in quarter 2 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

medits_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "MEDITS", haul_id])

####MRT (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MRT",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MRT",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MRT",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MRT",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MRT",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MRT",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Sampling inconsistent, exclude completely

mrt_hauls_keep <- NULL

####NAM

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NAM",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NAM",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NAM",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NAM",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NAM",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NAM",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep surveys in 1 and 2 (most consistently sampled) -Consistent spatial distribution through time -Seemingly consistent richness except for 1998 (exclude) -Seemingly consistent number of hauls except for 1998 (exclude)

nam_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NAM" & month %in% c(1,2) & year != 1998, haul_id])

####NEUS

NEUS Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 3,4,5 months -Inconsistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness (especially after 87, should be fixed with standardization step) -Seemingly consistent number of hauls (especially after 81, should be fixed with standardization step)

#calculate wgt_cpue (km^2 avg from sean Lucey) and wgt_h (all biomass values calibrated to standard pre 2009 30 minute tow)
FishGlob.10year.spp[survey == "NEUS", wgt_h := wgt/0.5][survey == "NEUS", wgt_cpue := wgt/0.0384][survey == "NEUS", num_h := num/0.5][survey == "NEUS", num_cpue := num/0.0384]


#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_spring_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Spring" & month %in% c(3:5) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
                                                        (survey_unit == "NEUS-Spring" & month %in% c(3:5) & year >= 2009 & (haul_dur > 0.25  & haul_dur < 0.42))), haul_id])

NEUS Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 months -Inconsistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness (especially after 84, should be fixed with standardization step) -Seemingly consistent number of hauls (especially after 85, should be fixed with standardization step)


#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_fall_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
                                                        (survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year >= 2009 & (haul_dur > 0.25  & haul_dur < 0.42))), haul_id])

####NIGFS Northern Ireland

Spring Northern Ireland (quarter 1)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 2,3,4 months -Inconsistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness -Seemingly consistent number of hauls

nigfs_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1" & month %in% c(2,3,4), haul_id])

Spring Northern Ireland (quarter 1)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 10,11 months -Consistent spatial distribution through time, but should be caught in standardization step -Seemingly consistent richness -Seemingly consistent number of hauls

nigfs_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4" & month %in% c(10,11), haul_id])

####Nor-BTS

OG FISHGLOB includes Nor-BTS-1 as well, but this was not shared by L. Pecuchet, and therefore ignored

Nor-BTS-3

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 8,9,10 -Somewhat consistent spatial distribution through time -Number of hauls is variable, but no clear years to exclude -Laurene Pecuchet (U Tromso) told us that only surveys 2004 and onwards work for biodiversity analyses

nor_bts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3" & month %in% c(8:10) & year >= 2004, haul_id])

####NS-IBTS

NS-IBTS-1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1,2,3 -Consistent spatial distribution through time -Linear increase in richness, cutoff on # hauls more clear -Linear increase, but somewhat clear break between late 70s and mid-80s, only keep hauls after 1984

ns_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1" & month %in% c(1:3) & year >= 1984, haul_id])

NS-IBTS-3

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 7,8,9 -Consistent spatial distribution through time -Consistent richness through time -Early years lower # hauls, will start at 1998

ns_ibts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3" & month %in% c(7:9) & year >= 1998, haul_id])

####NZ

NZ-CHAT

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 12,1,2 (NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO WE ALREADY LUMPED 12 with NEXT year) -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls after 1995

nz_chat_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT" & month %in% c(12,1,2) & year >= 1995, haul_id])

NZ-ECSI

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls -Gap between 1995 and 2005, but we have 10 total years so we’ll keep for now

nz_ecsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI" & month %in% c(4,5,6), haul_id])

NZ-SUBA

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 11 and 12 -Consistent spatial distribution through time -Seemingly consistent richness -Far more hauls in 1990s, these early sampling years will be excluded (start in 2000)

nz_suba_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA" & month %in% c(11,12) & year >= 2000, haul_id])

NZ-WCSI

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 3,4 -Consistent spatial distribution through time -Seemingly consistent richness -Linear decrease in # of hauls through time, leave out first two years with highest # hauls (>= 1995)

nz_wcsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI" & month %in% c(3,4) & year >= 1995, haul_id])

####PT-IBTS PT-IBTS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

pt_ibts_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS" & month %in% c(9,10,11), haul_id])

####ROCKALL

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ROCKALL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ROCKALL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 8,9 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

rockall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL" & month %in% c(8,9), haul_id])

####S-GEORG

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "S-GEORG",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "S-GEORG",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1 and 2 -Consistent spatial distribution through time -Seemingly consistent richness except for 2003, will be excluded -Seemingly consistent number of hauls, except for 2012, will be excluded

s_georg_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG" & month %in% c(1,2) & !(year %in% c(2003,2012)), haul_id])

####SCS

Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 2,3,4 -Inconsistent spatial distribution through time (northern latitudes only sampled in early years), only include longitudes < -62 and latitudes < 45.5 -Seemingly consistent richness -Number of hauls is variable, exclude super low and high numbers (1985,1994,2015,2019)

scs_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING" & month %in% c(2,3,4) & !(year %in% c(1985,1994,2015,2019)) & longitude_adj < -62 & latitude < 45.5, haul_id])

SUMMER

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 6,7,8 -Consistent spatial distribution through time -Richness increases linearly, not a clear break point, using breakpoint from # of hauls, but will exclude 2010 which has a very high richness -# Hauls increases linearly from ~120 in 1970 to ~220 in 2020, not a clear breakpoint, but will go with 1986 because there is a jump between 85 and 86 -Gear change in 1983 (Ellingsen et al.Ā 2015)

scs_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER" & month %in% c(6,7,8) & year >= 1986 & year != 2010, haul_id])

###SEUS

Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time -Consistent richness through time -# Hauls low in 1989 and 2018, will exclude

seus_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring" & month %in% c(4,5,6) & year != 1989 & year != 2018, haul_id])

Summer

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 7,8 -Consistent spatial distribution through time -Richness consistent through time -# Hauls low in first year, otherwise okay, just exclude first year (1989)

seus_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer" & month %in% c(7,8) & year != 1989, haul_id])

Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time -Richness consistent through time -# Hauls low in first year, otherwise okay, just exclude first year (1989)

seus_fall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall" & month %in% c(9,10,11) & year != 1989, haul_id])

####SWC-IBTS

Scotland Shelf Sea

SWC-IBTS 1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1,2,3 -Somewhat inconsistent spatial distribution through time, but this should be addressed in spatial standardization procedure -Richness consistent through time -# Hauls consistent except low in 1995, just exclude 1995

swc_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1" & month %in% c(1,2,3) & year != 1995, haul_id])

SWC-IBTS 4

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 10,11,12 -Somewhat inconsistent spatial distribution through time (southern latitudes only sampled in early years), but this should be addressed in spatial standardization procedure -Richness consistent through time (especially after mid 90s) -# Hauls consistent except low before 1995 and low in 2013, exclude these

swc_ibts_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4" & month %in% c(10,11,12) & year != 1995 & year >= 1995, haul_id])

####WCANN

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "WCANN",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "WCANN",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "WCANN",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "WCANN",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "WCANN",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "WCANN",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Here, one exception, will use four months (6,7,8,9) because all sampled consistently, and lower latitude areas sampled later in the summer consistently -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent through time

wcann_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "WCANN" & month %in% c(6:9), haul_id])

####WCTRI -Exclude because only 10 years and overlaps somewhat wiith WCANN

wctri_keep <- NULL

####ZAF

ATL

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Include 1,2,3 -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent through time after 1991

zaf_atl_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL" & month %in% c(1:3) & year >= 1991, haul_id])

IND

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Include 4,5,6 -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent before 2001, and then also in 2005 and 2009-2010

zaf_ind_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND" & month %in% c(4:6) & year %in% c(1985:2001,2005, 2009,2010), haul_id])

####Combine all lists that have _keep

#all objects with _keep
list_obj <- ls(pattern = "_keep")

#combine
fishglob_haulids_to_keep <- unlist(lapply(list_obj, get)) #229894 hauls (Started with 278405)

FishGlob.10year.spp_manualclean <- FishGlob.10year.spp[haul_id %in% fishglob_haulids_to_keep,]

#Require latitude and longitude for all observations
FishGlob.10year.spp_manualclean <- FishGlob.10year.spp_manualclean[complete.cases(FishGlob.10year.spp_manualclean[,.(latitude, longitude)])] #check that this works

#another check for # years sampled
#new row for total number of years sampled
FishGlob.10year.spp_manualclean[,years_sampled := length(unique(year)),.(survey_unit)]
View(unique(FishGlob.10year.spp_manualclean[,.(survey_unit, years_sampled)]))

#save
saveRDS(FishGlob.10year.spp_manualclean, file = here::here("data","cleaned","FishGlob.10year.spp_manualclean.rds"))

####Some surveys sample through end of year, fix these -NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO LUMP 1 and 2 with previous year

LS0tCnRpdGxlOiAiUHJlcGFyZSBGaXNoR2xvYiBEYXRhc2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBab8OrIEouIEtpdGNoZWwKZGF0ZTogT2N0b2JlciAxMSwgMjAyMwotLS0KClNjcmlwdCAxIGZvciBLaXRjaGVsIGV0IGFsLiAyMDIzIGluIHByZXAgdGF4b25vbWljIGRpdmVyc2l0eSBtYW51c2NyaXB0LgoKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcCkKbGlicmFyeShyYXN0ZXIpCiNsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KHJnYmlmKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJhc3RlclZpcykKbGlicmFyeShjb25jYXZlbWFuKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoZGF0YS50YWJsZSkKc2V0LnNlZWQoMSkKCmBgYAoKUHVsbCBpbiBjb21waWxlZCBhbmQgY2xlYW5lZCBkYXRhIGZyb20gRmlzaEdsb2IgZG93bmxvYWRlZCBvbiBOb3ZlbWJlciAyOCAyMDIyIChWIDEuNSkuIFRoaXMgaXMgdHlwaWNhbGx5IGNvbXBpbGVkIGJ5IERyLiBBdXJvcmUgTWF1cmVhdWQuIFRoaXMgaW5jbHVkZXMgcHVibGljIGFuZCBwcml2YXRlIGRhdGEgYW5kIHRoZXJlZm9yZSBsaW5rIGNhbm5vdCBiZSBzaGFyZWQuIEhvd2V2ZXIgd2l0aCBlZGl0aW5nIHlvdSBjYW4gcnVuIGFuYWx5c2VzIGZvciBwdWJsaWMgdHJhd2wgc3VydmV5cy4KCnxTdXJ2ZXkgY29kZXxTdXJ2ZXkgbmFtZSBzaG9ydHxTdXJ2ZXkgbmFtZSBsb25nfEFnZW5jeXxSZWdpb258QWNjZXNzfFByb3ZpZGVyL2xpbmsgdG8gYWNjZXNzfEluY2x1c2lvbgp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwKfEFJICB8QWxldXRpYW4gSXNsYW5kc3xBbGV1dGlhbiBJc2xhbmRzfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8QklUUy0xICB8QmFsdGljIFNlYSBRMXxCYWx0aWMgU2VhIFF1YXJ0ZXIgMXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxCSVRTLTQgIHxCYWx0aWMgU2VhIFE0fEJhbHRpYyBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfENITCAgfENoaWxlfENoaWxlfFVuaXZlcnNpZGFkIGRlIENvbmNlcGNpw7NuLCBDaGlsZXxTb3V0aCBBbWVyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxEYW5pZWxhIFllcHNvbiBkYW5pZWxhLnllcHNlbkBnbWFpbC5jb20gYW5kIEx1aXMgQ3ViaWxsb3MgbHVjdWJpbGxvc0BnbWFpbC5jb218SW5jbHVkZWR8CnxDT0x8IENvbG9tYmlhfCBDb2xvbWJpYW4gQ2FyaWJiZWFufFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlIENvbG9tYmlhfFNvdXRoIEFtZXJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fENhbWlsbyBCLiBHYXJjaWEgY2JnYXJjaWFyQHVuYWwuZWR1LmNvfFRvbyBmZXcgeWVhcnN8CnxERk8tSFMgIHxIZWNhdGUgU3RyYWl0fEhlY2F0ZSBTdHJhaXR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0Lzc4MGExYzAyLTFmOWMtNDk5NC1iYzcwLWEwZTllZjhlMzk2OCBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxUb28gZmV3IHllYXJzfAp8REZPLU5GICB8TmV3Zm91bmRsYW5kfE5ld2ZvdW5kbGFuZHxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfCBDYW5hZGF8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1hcmlhbm8gS29lbi1BbG9uc28gbWFyaWFuby5rb2VuLWFsb25zb0BkZm8tbXBvLmdjLmNhfEluY2x1ZGVkfAp8REZPLVFDUyAgfFF1ZWVuIENoYXJsb3R0ZSBTb3VuZHxRdWVlbiBDaGFybG90dGUgU291bmR8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3xDYW5hZGF8UHVibGljfGh0dHBzOi8vb3Blbi5jYW5hZGEuY2EvZGF0YS9lbi9kYXRhc2V0L2EyNzhkMWFmLWQ1NjctNDk2NC1hMTA5LWFlMWU4NGNiZDI0YSBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfERGTy1TT0cgIHxTdHJhaXQgb2YgR2VvcmdpYXxTdHJhaWdodCBvZiBHZW9yZ2lhfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9kODgwYmExOC04NzkwLTQxYTItYmY3My1lOTI0NzM4MDc1OWIgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxERk8tV0NIRyAgfFdlc3QgQ29hc3QgSGFpZGEgR3dhaWl8V2VzdCBDb2FzdCBIYWlkYSBHd2FpaXxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvNWVlMzA3NTgtYjFkNi00OWZlLThjNGUtNTEzNmY0YjM5YWQxIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfCBUb28gZmV3IHllYXJzfAp8REZPLVdDVkkgIHxXZXN0IENvYXN0IFZhbmNvdXZlciBJc2xhbmR8V2VzdCBDb2FzdCBWYW5jb3V2ZXIgSXNsYW5kfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC81NTdlNDJhZS0wNmZlLTQyNmQtODI0Mi1jMzEwNzY3MGIxZGUgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8IFRvbyBmZXcgeWVhcnN8CnxFQlMgIHxFYXN0ZXJuIEJlcmluZyBTZWF8RWFzdGVybiBCZXJpbmcgU2VhfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8RVZIT0UgIHxCYXkgb2YgQmlzY2F5fEJheSBvZiBCaXNjYXl8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8RkFMSyAgfEZhbGtsYW5kIElzbGFuZHN8RmFsa2xhbmQgSXNsYW5kc3xGYWxrbGFuZCBJc2xhbmRzIEZpc2hlcmllcyBEZXBhcnRtZW50fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxBbGV4YW5kZXIgQXJraGlwa2luIGFhcmtoaXBraW5AZmlzaGVyaWVzLmdvdi5mayBhbmQgSm9yZ2UgUmFtb3MgamVyYW1vc0BmaXNoZXJpZXMuZ292LmZrfCBFeGNsdWRlZCBhZnRlciBzcGF0aWFsIHRlbXBvcmFsIHN0YW5kYXJkaXphdGlvbiBpbiBuZXh0IHNjcmlwdHwKfEZSLUNHRlMgIHxFbmdsaXNoIENoYW5uZWx8RW5nbGlzaCBDaGFubmVsfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfEdJTiAgfEd1aW5lYXxHdWluZWF8TmF0aW9uYWwgQ2VudGVyIG9mIEZpc2hlcmllcyBTY2llbmNlcyBvZiBCb3Vzc291cmEsIENvbmFrcnksIFJlcHVibGljIG9mIEd1aW5lYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fE1vaGFtbWVkIExhbWluZSBDYW1hcmEgbWxjYW1hcmEua2VubmVkeUBnbWFpbC5jb218SW5jb25zaXN0ZW50IHNhbXBsaW5nIHRocm91Z2ggc3BhY2UgYW5kIHRpbWV8CnxHTUVYLVN1bW1lciAgfEd1bGYgb2YgTWV4aWNvIFN1bW1lcnxHdWxmIG9mIE1leGljbyBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHTUVYLUZhbGwgIHxHdWxmIG9mIE1leGljbyBGYWxsfEd1bGYgb2YgTWV4aWNvIEZhbGx8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxHT0EgIHxHdWxmIG9mIEFsYXNrYXxHdWxmIG9mIEFsYXNrYXxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfEdSTC1ERSAgfEdyZWVubGFuZHxHcmVlbmxhbmR8VGh1ZW5lbiBJbnN0aXR1dGUgb2YgU2VhIEZpc2hlcmllc3xFdXJvcGV8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fEthcmwtTWljaGFlbCBXZXJuZXIga2FybC1taWNoYWVsLndlcm5lckB0aHVlbmVuLmRlfEluY2x1ZGVkfAp8R1NMLU4gIHxOIEd1bGYgb2YgU3QuIExhd3JlbmNlfE5vcnRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xTZWUgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MCBmb3Igc3BlY2lmaWMgREZPIGxpbmtzfEluY2x1ZGVkfAp8R1NMLVMgIHxTIEd1bGYgb2YgU3QuIExhd3JlbmNlfFNvdXRoZXJuIEd1bGYgb2YgU3QuIExhd3JlbmNlfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xOTg5ZGUzMi1iYzVkLWM2OTYtODc5Yy01NGQ0MjI0MzhlNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxJQ0UtR0ZTICB8SWNlbGFuZHxJY2VsYW5kfE1hcmluZSBhbmQgRnJlc2h3YXRlciBSZXNlYXJjaCBJbnN0aXR1dGUsIEljZWxhbmR8RXVyb3BlfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKw7NuIFPDs2xtdW5kc3NvbiBqb24uc29sbXVuZHNzb25AaGFmb2d2YXRuLmlzfEluY2x1ZGVkfAp8SUUtSUdGUyAgfElyaXNoIFNlYXxJcmlzaCBTZWF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8SVMtVEFVfCBJc3JhZWwgfCBJc3JhZWx8IFRlbCBBdml2IFVuaXZlcnNpdHl8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8IEpvbmF0aGFuIEJlbG1ha2VyIGpvbmF0aGFuLmJlbG1ha2VyQGdtYWlsLmNvbXxUb28gZmV3IHllYXJzfAp8SVMtTU9BR3xJc3JhZWx8SXNyYWVsfElzcmFlbGkgTWluaXN0cnkgb2YgQWdyaWN1bHR1cmV8QXNpYXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8T3JlbiBTb25pbiBvcmVuc0Btb2FnLmdvdi5pbCBhbmQgRG9yaSBFZGVsaXN0IGJsYWNrcmVlZnNAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TUVESVRTICB8TWVkaXRlcnJhbmVhbnxNZWRpdGVycmFuZWFufE11bHRpcGxlfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8Q29udGFjdCBjb3JyZXNwb25kaW5nIGF1dGhvciBmb3IgY29udGFjdHN8SW5jbHVkZWR8CnxNUlR8TWF1cml0YW5pYXxNYXVyaXRhbmlhfEluc3RpdHV0IE1hdXJpdGFuaWVuIGRlIFJlY2hlcmNoZXMgT2PDqWFub2dyYXBoaXF1ZXMgZXQgZGVzIFDDqmNoZXMsIE5vdWFkaGlib3UsIE1hdXJpdGFuaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxCZXlhaCBNZWlzc2EgYm1vdWxkaGFiaWJAZ21haWwuY29tfEluY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHNwYWNlIGFuZCB0aW1lfAp8TkFNICB8TmFtaWJpYXxOYW1pYmlhfE5hdGlvbmFsIE1hcmluZSBJbmZvcm1hdGlvbiBhbmQgUmVzZWFyY2ggQ2VudHJlLCBNaW5pc3RyeSBvZiBGaXNoZXJpZXMgYW5kIE1hcmluZSBSZXNvdXJjZXMsIE5hbWliaWF8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxKb2hhbm5lcyBLYXRoZW5hIGpvaG4ua2F0aGVuYUBtZm1yLmdvdi5uYXxJbmNsdWRlZHwKfE5FVVMtRmFsbCAgfE5FIFVTIEZhbGx8Tm9ydGhlYXN0IFVTQSBGYWxsfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8TkVVUy1TcHJpbmcgIHxORSBVUyBTcHJpbmd8Tm9ydGhlYXN0IFVTQSBTcHJpbmd8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxOSUdGUy0xICB8TiBJcmVsYW5kIFExfE5vcnRoIElyZWxhbmQgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5JR0ZTLTQgIHxOIElyZWxhbmQgUTR8Tm9ydGggSXJlbGFuZCBRdWFydGVyIDR8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8Tm9yLUJUUy0zICB8QmFyZW50cyBTZWEgTm9yd2F5IFEzfEJhcmVudHMgU2VhIE5vcndheSBRM3xJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxOUy1JQlRTLTEgIHxOIFNlYSBRMXxOb3J0aCBTZWEgUXVhcnRlciAxfEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfE5TLUlCVFMtMyAgfE4gU2VhIFEzfE5vcnRoIFNlYSBRdWFydGVyIDN8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8TlotQ0hBVCAgfENoYXRoYW0gUmlzZSBOWnxDaGF0aGFtIFJpc2UgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1FQ1NJICB8RSBDb2FzdCBTIElzbGFuZCBOWnxFYXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfE5aLVNVQkEgIHxTdWItQW50YXJjdGljIE5afFN1Yi1BbnRhcmN0aWMgTmV3IFplYWxhbmR8TmF0aW9uYWwgSW5zdGl0dXRlIG9mIFdhdGVyIGFuZCBBdG1vc3BoZXJpYyBSZXNlYXJjaCBMaW1pdGVkLCBOZXcgWmVhbGFuZHwgT2NlYW5pYXwgUmVxdWlyZXMgZGF0YSByZXF1ZXN0fFJpY2hhcmQgTydEcmlzY29sbCByaWNoYXJkLm9kcmlzY29sbEBuaXdhLmNvLm56IGFuZCBGYWJyaWNlIFN0ZXBoZW5zb24gZmFicmljZS5zdGVwaGVuc29uQHdhaWthdG8uYWMubnp8SW5jbHVkZWR8CnxOWi1XQ1NJICB8VyBDb2FzdCBTIElzbGFuZCBOWnxXZXN0IENvYXN0IFNvdXRoIElzbGFuZCBOZXcgWmVhbGFuZHxOYXRpb25hbCBJbnN0aXR1dGUgb2YgV2F0ZXIgYW5kIEF0bW9zcGhlcmljIFJlc2VhcmNoIExpbWl0ZWQsIE5ldyBaZWFsYW5kfCBPY2VhbmlhfCBSZXF1aXJlcyBkYXRhIHJlcXVlc3R8UmljaGFyZCBPJ0RyaXNjb2xsIHJpY2hhcmQub2RyaXNjb2xsQG5pd2EuY28ubnogYW5kIEZhYnJpY2UgU3RlcGhlbnNvbiBmYWJyaWNlLnN0ZXBoZW5zb25Ad2Fpa2F0by5hYy5uenxJbmNsdWRlZHwKfFBULUlCVFMgIHxQb3J0dWdhbHxQb3J0dWdhbHxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxST0NLQUxMICB8Um9ja2FsbCBQbGF0ZWF1fFJvY2thbGwgUGxhdGVhdXxJbnRlcm5hdGlvbmFsIENvdW5jaWwgZm9yIHRoZSBFeHBsb3JhdGlvbiBvZiB0aGUgU2VhfEV1cm9wZXxQdWJsaWN8aHR0cHM6Ly9kYXRyYXMuaWNlcy5kay9EYXRhX3Byb2R1Y3RzL0Rvd25sb2FkL0Rvd25sb2FkX0RhdGFfcHVibGljLmFzcHh8SW5jbHVkZWR8CnxTLUdFT1JHICB8UyBHZW9yZ2lhfFNvdXRoIEdlb3JnaWF8QnJpdGlzaCBBbnRhcmN0aWMgU3VydmV5fFNvdXRoZXJuIE9jZWFufFJlcXVpcmVzIGRhdGEgcmVxdWVzdHxNYXJrIEJlbGNoaWVyIG1hcmsuYmVsY2hpZXJAZ292LmdzIGFuZCBNYXJ0aW4gQ29sbGlucyBtYWNvbEBiYXMuYWMudWt8SW5jbHVkZWR8CnxTQ1MtRmFsbCAgfFNjb3RpYW4gU2hlbGYgRmFsbHxTY290aWFuIFNoZWxmIFN1bW1lcnxEZXBhcnRtZW50IG9mIEZpc2hlcmllcyBhbmQgT2NlYW5zfENhbmFkYXxQdWJsaWN8aHR0cHM6Ly9vcGVuLmNhbmFkYS5jYS9kYXRhL2VuL2RhdGFzZXQvMTM2NmUxZjEtZTJjOC00OTA1LTg5YWUtZTEwZjFiZTBhMTY0IGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfFRvbyBmZXcgeWVhcnN8SW5jbHVkZWR8CnxTQ1MtU1BSSU5HICB8U2NvdGlhbiBTaGVsZiBTcHJpbmd8U2NvdGlhbiBTaGVsZiBTcHJpbmd8RGVwYXJ0bWVudCBvZiBGaXNoZXJpZXMgYW5kIE9jZWFuc3wgQ2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC9mZWNmMDQ1YS05NWEyLTRiNjktOGE0MC04MTg2NDlhNjI3MTYgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8VG9vIG11Y2ggZGF0YSBsb3NzIGFmdGVyIHNwYXRpYWwgdGVtcG9yYWwgc3RhbmRhcmRpemF0aW9ufAp8U0NTLVNVTU1FUiAgfFNjb3RpYW4gU2hlbGYgU3VtbWVyfFNjb3RpYW4gU2hlbGYgU3VtbWVyfERlcGFydG1lbnQgb2YgRmlzaGVyaWVzIGFuZCBPY2VhbnN8Q2FuYWRhfFB1YmxpY3xodHRwczovL29wZW4uY2FuYWRhLmNhL2RhdGEvZW4vZGF0YXNldC8xMzY2ZTFmMS1lMmM4LTQ5MDUtODlhZS1lMTBmMWJlMGExNjQgYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTRVVTLWZhbGwgIHxTRSBVUyBGYWxsfFNvdXRoZWFzdCBVU0EgRmFsbHxOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbnwgVVNBfFB1YmxpY3xEaXNNQVA6IGh0dHBzOi8vYXBwcy1zdC5maXNoZXJpZXMubm9hYS5nb3YvZGlzbWFwLyBhbmQgT2NlYW5BZGFwdDogaHR0cHM6Ly96ZW5vZG8ub3JnL3JlY29yZHMvODEwMzA4MHxJbmNsdWRlZHwKfFNFVVMtc3ByaW5nICB8U0UgVVMgU3ByaW5nfFNvdXRoZWFzdCBVU0EgU3ByaW5nfE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9ufCBVU0F8UHVibGljfERpc01BUDogaHR0cHM6Ly9hcHBzLXN0LmZpc2hlcmllcy5ub2FhLmdvdi9kaXNtYXAvIGFuZCBPY2VhbkFkYXB0OiBodHRwczovL3plbm9kby5vcmcvcmVjb3Jkcy84MTAzMDgwfEluY2x1ZGVkfAp8U0VVUy1zdW1tZXIgIHxTRSBVUyBTdW1tZXJ8U291dGhlYXN0IFVTQSBTdW1tZXJ8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxTV0MtSUJUUy0xICB8U2NvdGxhbmQgU2hlbGYgU2VhIFExfFNjb3RsYW5kIFNoZWxmIFNlYSBRdWFydGVyIDF8SW50ZXJuYXRpb25hbCBDb3VuY2lsIGZvciB0aGUgRXhwbG9yYXRpb24gb2YgdGhlIFNlYXxFdXJvcGV8UHVibGljfGh0dHBzOi8vZGF0cmFzLmljZXMuZGsvRGF0YV9wcm9kdWN0cy9Eb3dubG9hZC9Eb3dubG9hZF9EYXRhX3B1YmxpYy5hc3B4fEluY2x1ZGVkfAp8U1dDLUlCVFMtNCAgfFNjb3RsYW5kIFNoZWxmIFNlYSBRNHxTY290bGFuZCBTaGVsZiBTZWEgUXVhcnRlciA0fEludGVybmF0aW9uYWwgQ291bmNpbCBmb3IgdGhlIEV4cGxvcmF0aW9uIG9mIHRoZSBTZWF8RXVyb3BlfFB1YmxpY3xodHRwczovL2RhdHJhcy5pY2VzLmRrL0RhdGFfcHJvZHVjdHMvRG93bmxvYWQvRG93bmxvYWRfRGF0YV9wdWJsaWMuYXNweHxJbmNsdWRlZHwKfFdCTFN8IFdlc3Rlcm4gQmxhY2sgU2VhfCBXZXN0ZXJuIEJsYWNrIFNlYXxJbnN0aXR1dGUgb2YgRmlzaCBSZXNvdXJjZXMsIEJ1bGdhcmlhfEV1cm9wZXxSZXF1aXJlcyBkYXRhIHJlcXVlc3R8RWxpdHNhIFBldHJvdmEgKGVsaXRzc2FAeWFob28uY29tKSwgRmVyaWhhIFRzZXJrb3ZhICYgVmVzc2VsaW5hIE1paG5ldmF8IFRvbyBmZXcgeWVhcnN8CnxXQ0FOTiAgfFcgQ29hc3QgVVN8V2VzdCBDb2FzdCBVU0F8TmF0aW9uYWwgT2NlYW5pYyBhbmQgQXRtb3NwaGVyaWMgQWRtaW5pc3RyYXRpb258IFVTQXxQdWJsaWN8RGlzTUFQOiBodHRwczovL2FwcHMtc3QuZmlzaGVyaWVzLm5vYWEuZ292L2Rpc21hcC8gYW5kIE9jZWFuQWRhcHQ6IGh0dHBzOi8vemVub2RvLm9yZy9yZWNvcmRzLzgxMDMwODB8SW5jbHVkZWR8CnxaQUYtQVRMICB8QXRsYW50aWMgT2NlYW4gWkF8QXRsYW50aWMgT2NlYW4gU291dGggQWZyaWNhfERlcGFydG1lbnQgb2YgRm9yZXN0cnksIEZpc2hlcmllcyBhbmQgdGhlIEVudmlyb25tZW50LCBTb3V0aCBBZnJpY2F8QWZyaWNhfFJlcXVpcmVzIGRhdGEgcmVxdWVzdHwgVHJhY2V5IEZhaXJ3ZWF0aGVyIHRyYWNleWZAZGFmZi5nb3YuemF8SW5jbHVkZWR8CnxaQUYtSU5EICB8SW5kaWFuIE9jZWFuIFpBfEluZGlhbiBPY2VhbiBTb3V0aCBBZnJpY2F8RGVwYXJ0bWVudCBvZiBGb3Jlc3RyeSwgRmlzaGVyaWVzIGFuZCB0aGUgRW52aXJvbm1lbnQsIFNvdXRoIEFmcmljYXxBZnJpY2F8UmVxdWlyZXMgZGF0YSByZXF1ZXN0fCBUcmFjZXkgRmFpcndlYXRoZXIgdHJhY2V5ZkBkYWZmLmdvdi56YXxJbmNsdWRlZHwKCgoKCmBgYHtyIHB1bGwgaW4gZmlzaGdsb2IgZGF0YWJhc2V9CgpGaXNoR2xvYl8xLjUgPC0gZnJlYWQoaGVyZTo6aGVyZSgiZGF0YSIsIkZJU0hHTE9CX3YxLjVfY2xlYW4uY3N2IikpCgpgYGAKClRoaXMgdmVyc2lvbiBvZiBGaXNoR2xvYiBsZWF2ZXMgb3V0IHNlYXNvbnMgZm9yIEdNRVgsIGZpeCBoZXJlCgpgYGB7ciBhZGQgc2Vhc29uIHRvIEdNRVh9CiNhZGQgc2Vhc29uIHRvIEdNRVggdG8gc3VydmV5IHVuaXQKCkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIkdNRVgiLCBzdXJ2ZXlfdW5pdCA6PSBwYXN0ZTAoc3VydmV5LCItIixzZWFzb24pXQpgYGAKCkFsc28gYWRkaW5nIGluIHNlYXNvbnMgZm9yIE5JR0ZTCgpgYGB7ciBhZGQgc2Vhc29uIHRvIE5JR0ZTfQojYWRkIHNlYXNvbiB0byBHTUVYIHRvIHN1cnZleSB1bml0CgpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJOSUdGUyIsIHN1cnZleV91bml0IDo9IHBhc3RlMChzdXJ2ZXksIi0iLHF1YXJ0ZXIpXQpgYGAKClpBRiAoU291dGggQWZyaWNhKSBoYXMgZGlzdGluY3QgQXRsYW50aWMgYW5kIEluZGlhbiBzdXJ2ZXlzIChzcGxpdCAgYXQgfjIwLjAxy5ogRSwgQ2FwZSBBZ3VsaGFzKQoKYGBge3IgYWRkIGxvbmdpdHVkaW5hbCByZWdpb24gdG8gWkFGfQpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJaQUYiICYgbG9uZ2l0dWRlIDwyMC4wMSwgc3VydmV5X3VuaXQgOj0gIlpBRi1BVEwiXVtzdXJ2ZXkgPT0gIlpBRiIgJiBsb25naXR1ZGUgPj0gMjAuMDEsIHN1cnZleV91bml0IDo9ICJaQUYtSU5EIl0KYGBgCgpSZWdpb24gbmFtZXMKYGBge3J9CnNvcnQodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkKYGBgCiMjRGF0YSBSZXBsYWNlbWVudHMKIyMjI0dyZWVubGFuZCAodmVyc2lvbiBpbiBGaXNoR2xvYiAxLjUgaXMgbWlzc2luZyBsZW5ndGhzIGFuZCB0aGVyZWZvcmUgYmlvbWFzcyB2YWx1ZXMpClRoaXMgdmVyc2lvbiB3YXMgb2J0YWluZWQgZGlyZWN0bHkgZnJvbSBLYXJsLU1pY2hhZWwgV2VybmVyIFtrYXJsLW1pY2hhZWwud2VybmVyQHRodWVuZW4uZGVdKGthcmwtbWljaGFlbC53ZXJuZXJAdGh1ZW5lbi5kZSkgd2hvIG5vdyBtYW5hZ2VzIHRoZSBHcmVlbmxhbmQgc3VydmV5IFNlcHRlbWJlciAyMDIzLiBIZSBpcyBiYXNlZCBpbiBHZXJtYW55LgoKYGBge3J9CiNncmVlbmxhbmQgPC0gCgpgYGAKCiMjIyNOb3J3YXkKUHJlcHBlZCBieSBMYXVyZW5lIFBlY3VjaGV0IChVIFRyw7Ztc28sIE5vcndheSkgU2VwdGVtYmVyIDIwMjMgdG8gcmVwbGFjZSB3aGF0J3MgaW4gRmlzaEdsb2IgMS41IGJlY2F1c2UgSU1SICJhcmUgcXVpdGUgY29uY2VybmVkIHRoYXQgRmlzaEdsb2IsIGFuZCBvdGhlciBzdHVkaWVzLCBoYXZlIGJlZW4gdXNpbmcgYSAiZmxhd2VkIiBtdWx0aS1zdXJ2ZXlzIGRhdGFzZXQgdGhhdCBpcyBhdmFpbGFibGUgaW4gTk1EQyAoZGF0YSBwb3J0YWwgb2YgSU1SKS4gVHVybnMgb3V0IHRoYXQgdGhpcyBkYXRhc2V0IHdhcyBwdXQgcHVibGljbHkgYnkgbWlzY29tbXVuaWNhdGlvbiBvbiBOTURDIGFmdGVyIG9uZSBwdWJsaXNoZWQgcGFwZXIgaW4gU2NpZW50aWZpYyBSZXBvcnRzLCBhbmQgSSB0aGluayB0aGV5IG9ubHkgcmVhbGl6ZWQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGRhdGFzZXQganVzdCB0aGUgbGFzdCB5ZWFyIGFzIHNvbWUgcGFwZXJzIGFyZSBjb21pbmcgb3V0IHVzaW5nIGl0IChlc3BlY2lhbGx5IHRoZSBvbmUgZnJvbSBDZXNjIEdvcmRvLVZpbGFzZWNhIGluIFBOQVMgaHR0cHM6Ly93d3cucG5hcy5vcmcvZG9pLzEwLjEwNzMvcG5hcy4yMTIwODY5MTIwKS4gVGhleSBhcmUgbm93IHRyeWluZyB0byBtYWtlIHNvbWUgZGFtYWdlIGNvbnRyb2xzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGF0YXNldCBpcyBub3QgdXNlZCBldmVyIGFnYWluIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IGNsZWFuZGVkIGFuZCBzdGFuZGFyZGlzZWQgZGF0YXNldHMgb2YgdGhlIEJhcmVudHMgU2VhIHN1cnZleSB0aGF0IGFyZSBwdWJsaWNseSBhdmFpbGFibGUgaW4gTk1EQyBhcmUgdXNlZCBpbnN0ZWFkIG9mLgoKU2VwdGVtYmVyIDE0OiBGcm9tIExhdXJlbmUsICJJIHNlbmQgeW91IGluIGF0dGFjaG1lbnQgdGhlIOKAnG5ld+KAnSBJTVIgc3VydmV5IGZvcm1hdHRlZCBmb3IgRmlzaGdsb2IuIEkgaGF2ZSBkb25lIHNvbWUgc21hbGwgY2hlY2sgb2YgdGhlIGRhdGFzZXQsIGFuZCBzbyBmYXIgZXZlcnl0aGluZyBsb29rcyBnb29kLCBidXQgSSBkaWRu4oCZdCBkbyBhIGRlZXAgY2hlY2sgeWV0LCBidXQgSSBkb27igJl0IHNlZSB3aHkgdGhlcmUgc2hvdWxkIGJlIGFueSBwcm9ibGVtcyB3aXRoIGl0Li4uLkZvciB5b3VyIHN0dWR5LCBJIHRoaW5rIGl0IGlzIGFsc28gaW1wb3J0YW50IHRoYXQgeW91IGtub3cgdGhhdCB0aGVyZSBoYXMgYmVlbiBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0YXhvbm9taWMgZGVzY3JpcHRpb25zIGluIHRoZSBCYXJlbnRzIFNlYSBzbyB0aGF0IHNvbWUgc3BlY2llcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhdCB0aGUgZ2VudXMgbGV2ZWwgaW5zdGVhZCBvZiBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2lzLCBJIHNlbmQgeW91IGluIGF0dGFjaCBhbiBleGNlbCAoQmFyZW50cyBTZWEgRmlzaCBSZWZlcmVuY2UgTGlzdC5jc3YpIGZpbGUgdGhhdCBzdW1tYXJpemUgd2hpY2ggc3BlY2llcyBtaWdodCBiZSBhIG1pc2lkZW50aWZpY2F0aW9uIGFuZCB3aGljaCBvbmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW5kIG1lcmdlZC4iIEFsbCBvZiB0aGVzZSBmaWxlcyBub3cgbGl2ZSBpbiAiZGF0YS9Ob3J3YXlfU2VwMjAyMyIKCkhlbHBmdWwgZ3VpZGFuY2UgZnJvbSBoZXJlOiBodHRwczovL3d3dy5oaS5uby9lbi9oaS9uZXR0cmFwcG9ydGVyL3JhcHBvcnQtZnJhLWhhdmZvcnNrbmluZ2VuLWVuLTIwMjEtMTUKLSAiMi4yLjUgLSBSZWNvbW1lbmRlZCBhZGp1c3RtZW50cyB0byB0aGUgb3V0cHV0IGJlZm9yZSBhbmFseXNpcwpFZWxwb3V0cyBhbmQgbGlwYXJpZHMuIFdoZW4gY29tYmluZyB5ZWFycywgd2UgcmVjb21tZW5kIHRoYXQgYWxsIHJlY29yZHMgb2YgZWVscG91dHMgKFpvYXJjaWRhZSkgYXJlIHBvb2xlZCB0byB0aGUgZmFtaWx5IGxldmVsLCBiZWNhdXNlIHRoZXkgYXJlIG5vdG9yaW91c2x5IGRpZmZpY3VsdCB0byBpZGVudGlmeSAoc2VlIEFwcGVuZGl4IDMpLiBUaGUgc2FtZSBhcHBseSB0byBsaXBhcmlkcyAoTGlwYXJpZGFlKS4gSWYgc3BlY2llcyBsZXZlbCBkYXRhIG9mIHRoZXNlIGZhbWlsaWVzIGFyZSB1c2VkLCBjb25zaWRlciBleGNsdWRpbmcgZGF0YSBmcm9tIDIwMDQtMjAwNi8yMDA3LiBUaGVzZSB5ZWFycyB0aGUgc3RhZmYgb24gc29tZSBvZiB0aGUgTm9yd2VnaWFuIHZlc3NlbHMgd2VyZSBpbmV4cGVyaWVuY2VkLCBhbmQgcHJvcGVyIGlkZW50aWZpY2F0aW9uIGtleXMgZm9yIGFyY3RpYyBzcGVjaWVzIHdlcmUgbGFja2luZyAoY29tcGFyZSBmb3IgaW5zdGFuY2UgY2F0Y2hlcyBvZiBMeWNvZGVzIGZyaWdpZHVzIGFuZCBMeWNvZGVzIGV1ZGlwbGV1cm9zdGljdHVzIGluIHRoZSBmaXJzdCB5ZWFycyB0byB0aGUgbGF0ZXIgeWVhcnMsIEFwcGVuZGl4IDMpLiBJZiBzcGVjaWVzIGxldmVsIGRhdGEgb2YgdGhlc2UgZmFtaWxpZXMgYXJlIHVzZWQsIHJlY29yZHMgdG8gZmFtaWx5IGxldmVscyBzaG91bGQgYmUgcmVtb3ZlZCBvciBlbHNlIHRoZXNlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGZ1cnRoZXIgYW5hbHlzaXMgb2YgdGhlIGRhdGEuIEJvdGggWm9hcmNpZGFlIGFuZCBMaXBhcmlkYWUgaGF2ZSB1bnJlc29sdmVkIHRheG9ub215IGZvciBzb21lIGdlbmVyYSwgdGhlcmVmb3JlIHdlIGhhdmUgY2hvc2VuIHRvIHBvb2wgYWxsIGxpcGFyaWRzIG9mIHRoZSBnZW51cyBDYXJlcHJvY3R1cyBhbmQgYWxsIGVlbHBvdXRzIG9mIHRoZSBnZW51cyBHeW1uZWx1cyBpbiB0aGUgb3V0cHV0LiBTZWJhc3Rlcy4gVGhlIGNvbHVtbiAiIFNlYmFzdGVzIHNwcC4iIGNvbnRhaW5zIG1haW5seSBqdXZlbmlsZSByZWRmaXNoLiBTbWFsbCBzcGVjaW1lbnMgYXJlIHZlcnkgZGlmZmljdWx0IHRvIGlkZW50aWZ5IHNvIHRoZSBwcm90b2NvbCBpcyB0byBpZGVudGlmeSBvbmx5IGluZGl2aWR1YWxzIGxhcmdlciB0aGFuIDEwIGNtIHRvIHRoZSBzcGVjaWVzIGxldmVsLiBCZWZvcmUgYW5hbHlzaXMsIGFsbCByZWRmaXNoICggUyAuIG1lbnRlbGxhICwgUy4gbm9ydmVnaWN1cywgUy4gdml2aXBhcnVzIGFuZCBTZWJhc3RlcyBzcHAgLikgc2hvdWxkIGJlIHBvb2xlZCwgb3IgU2ViYXN0ZXMgc3BwLiBzaG91bGQgYmUgcmVtb3ZlZCDigJMgaWYgbm90IGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIHNwZWNpZXMgaW4gdGhlIGFuYWx5c2lzIC4gUmVjb3JkcyBpbiBBcHBlbmRpeCAyLiBUaGUgcmVjb3JkcyBvZiB0aGUgUy4gdml2aXBhcnVzIHdlc3Qgb2YgU3ZhbGJhcmQoU3BpdHNiZXJnZW4pIGFyZSB1bnJlbGlhYmxlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBpZiBTZWJhc3RlcyBkYXRhIGFyZSBrZXB0IGF0IHRoZSBzcGVjaWVzIGxldmVsIChBcHBlbmRpeCAyKS4gU3BlY2llcyB2ZXJpZmllZCBmb3IgdGhlIEJhcmVudHMgU2VhLCBidXQgb3V0bGllcnMgaW4gdGVybXMgdGhlIG5vcm1hbCBkZXB0aCByYW5nZSwgZGlzdHJpYnV0aW9uIGFyZWEgd2l0aGluIHRoZSBCYXJlbnRzIFNlYSwgc2l6ZSBldGMuIHdlcmUgY29kZWQgYXMgcXVlc3Rpb25hYmxlIGluIHRoZSBkYXRhIGJhc2UgKEFwcGVuZGl4IDIpIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgYW5hbHlzaXMuIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgcGVsYWdpYyBzcGVjaWVzIChlLmcuIGNhcGVsaW4gYW5kIGhlcnJpbmcpLCBhcyB0aGVzZSBhcmUgcG9vcmx5IHNhbXBsZWQgYnkgdGhlIGJvdHRvbSB0cmF3bC4gVGhlIGRhdGEgc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCB3aXRoIHRvd2luZyBkaXN0YW5jZSBiZWZvcmUgYW5hbHlzaXMuIgoKVGhlcmVmb3JlLCB3ZSB3aWxsOgotIFJlbW92ZSBhbGwgcmVjb3JkcyBvZiBlZWxwb3V0cyBhbmQgbGlwYXJpZHMgKEZhbWlseSA9IFpvYXJjaWRhZSBvciBMaXBhcmlkYWUpIChhcyB3ZSBvbmx5IGluY2x1ZGUgc3BlY2llcyBJRCdkIHRvIHNwZWNpZXMpCi0gUmVtb3ZlIHJlZGZpc2ggKEdlbnVzID0gU2ViYXN0ZXMpCgpgYGB7ciBub3J3YXkgZGF0YX0KCiNsb2FkIE5vcndlZ2lhbiBkYXRhCmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsIk5vcndheV9TZXAyMDIzIiwiTk9SLUJUU19jbGVhbi5SRGF0YSIpKQpub3J3YXlfY2xlYW4gPC0gZGF0YS50YWJsZShkYXRhKQoKI3JlbW92ZSBvYnNlcnZhdGlvbnMgd2l0aG91dCBkYXRlcwpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuW2NvbXBsZXRlLmNhc2VzKG5vcndheV9jbGVhblssLihtb250aCldKSxdCgojcmVtb3ZlIHNwZWNpZXMgcmVjb3JkcyBpbiBhY2NvcmRhbmNlIHdpdGggcmVjb21tZW5kYXRpb24gZnJvbSBISQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWyEoZmFtaWx5ICVpbiUgYygiWm9hcmNpZGFlIiwiTGlwYXJpZGFlIikgfCBnZW51cyA9PSAiU2ViYXN0ZXMiKSxdCgojc29tZSBjb2x1bW4gbmFtZXMgZG9uJ3QgbWF0Y2ggZmlzaGdsb2IgKGZpc2hnbG9iID0gbnVtLCBudW1faCwgbnVtX2NwdWUsIHdndCwgd2d0X2gsIHdndF9jcHVlOyBub3J3YXkgPSBudW0sIG51bV9jcHVlIChudW1iZXIgb2YgaW5kLi9ob3VyKSwgbnVtX2NwdWEgKG51bWJlciBvZiBpbmQuL2ttMiksIHdndCwgd2d0X2NwdWUgKGtnL21pbiksIHdndF9jcHVhKGtnL2ttMikgICkKI2Fsc28sIHNvbWUgY29sdW1uIHVuaXRzIGluIHRoZSByZWFkbWUgYXJlIGluIGNvcnJlY3QuIFRoZXJlZm9yZSwgSSB3aWxsIGdlbmVyYXRlIF9jcHVlIGFuZCBfaCB2YWx1ZXMgaGVyZQojIHdlIHdpbGwgbmVlZCB0byBjaGVjayAgYW5kIHJlbmFtZSBjb2x1bW5zCnNldG5hbWVzKG5vcndheV9jbGVhbiwgYygiaGF1bF9kdXIiKSwgYygiaGF1bF9kdXJfbSIpKQpub3J3YXlfY2xlYW5bLGhhdWxfZHVyIDo9IGhhdWxfZHVyX20vNjBdICNoYXVsIGR1cmF0aW9uIGN1cnJlbnRseSBpbiBtaW51dGVzLCBuZWVkIGhvdXJzCm5vcndheV9jbGVhblssbnVtX2ggOj0gbnVtL2hhdWxfZHVyXVssbnVtX2NwdWUgOj0gbnVtL2FyZWFfc3dlcHRdWyx3Z3RfaCA6PSB3Z3QvaGF1bF9kdXJdWyx3Z3RfY3B1ZSA6PSB3Z3QvYXJlYV9zd2VwdF0KCiNjaGFuZ2Ugc29tZSBjb2x1bW5zIHRvIG51bWVyaWMKY29scyA9IGMoIm1vbnRoIiwiZGF5IikKbm9yd2F5X2NsZWFuWywoY29scykgOj0gbGFwcGx5KC5TRCxhcy5udW1lcmljKSwuU0Rjb2xzID0gY29sc10KCiNhbHNvLCBkZWxldGUgc291cmNlIGFuZCB0aW1lc3RhbXAKZmlzaGdsb2JfY29sbmFtZXMgPC0gY29sbmFtZXMoRmlzaEdsb2JfMS41KQpub3J3YXlfY2xlYW4gPC0gbm9yd2F5X2NsZWFuWywuLmZpc2hnbG9iX2NvbG5hbWVzXQoKbm9yd2F5X2NsZWFuW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoMTo2KSwgc3VydmV5X3VuaXQgOj0gIk5vci1CVFMtMSJdW3N1cnZleSA9PSAiTm9yLUJUUyIgJiBtb250aCAlaW4lIGMoNzoxMiksIHN1cnZleV91bml0IDo9ICJOb3ItQlRTLTMiXQoKI092ZXJsYXAgYmV0d2VlbiBJQlRTIGFuZCBOb3ItQlRTIHN1cnZleXMgYmVsb3cgNjLLmmxhdGl0dWRlLCBzbyBkZWxldGUgYWxsIGhhdWxzIHRoYXQgb2NjdXIgYmVsb3cgNjLLmmxhdGl0dWRlCm5vcndheV9jbGVhbiA8LSBub3J3YXlfY2xlYW5bbGF0aXR1ZGUgID49IDYyLF0KCmBgYAoKCkRlbGV0ZSBHcmVlbmxhbmQgYW5kIE5vcndheQpgYGB7cn0KRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKHN1cnZleSAlaW4lIGMoIk5vci1CVFMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiR1JMLURFIiAjaWdub3JlIGdyZWVubGFuZCBmb3Igbm93Li4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXQpgYGAKCgpBZGQgaW4gdXBkYXRlZCBHcmVlbmxhbmQgYW5kIE5vcndheSBkYXRhCmBgYHtyfQpGaXNoR2xvYl8xLjUgPC1yYmluZChGaXNoR2xvYl8xLjUsbm9yd2F5X2NsZWFuKQojRmlzaEdsb2JfMS41IDwtcmJpbmQoRmlzaEdsb2JfMS41LGdyZWVubGFuZCkKYGBgCgoKIyNQcmVsaW1pbmFyeSBEYXRhIEN1dHMKIyMjU3BlY2lmaWMgUmVnaW9uYWwgQ2hhbmdlcyBCZWZvcmUgQ3V0dGluZyB0byAxMCB5ZWFycyBvbmx5CgoqR1NMKgotIE5vcnRoOiB3ZSBoYXZlIGRhdGEgMTk4MC0yMDE5LCBidXQgZ2VhciBjaGFuZ2VzIGluIDIwMDQvMjAwNSwgc28gbGV0J3MgdXNlIGxhdGVyIHBvcnRpb24gKG1vcmUgY29uc2lzdGVudCBtb250aHMgb2Ygc2FtcGxpbmc7IDIwMDUtMjAxOTsgMTUgeWVhcnMpIAotIFNvdXRoOiB3ZSBoYXZlIGRhdGEgMTk3MC0yMDE5LCBidXQgZ2Vhci92ZXNzZWwgY2hhbmdlcyBpbiAxOTg1IGFuZCBhZ2FpbiBpbiAxOTkyLCBzbyBhZ2FpbiBsZXQncyB1c2UgbGF0ZXIgcG9ydGlvbiAoMTk5Mi0yMDE5OyAyNyB5ZWFycykKLSBTZWUgW3RoaXMgZ2l0aHViIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vQXF1YUF1bWEvZmlzaGdsb2IvaXNzdWVzLzcyKQoKYGBge3IgR1NMIGZpeGVzfQojaWRlbnRpZnkgaGF1bF9pZHMgb2YgaGF1bHMgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIEdTTCBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9HU0wgPC0gdW5pcXVlKEZpc2hHbG9iXzEuNVsoc3VydmV5ID09ICJHU0wtTiIgJiB5ZWFyIDwgMjAwNSl8KHN1cnZleSA9PSAiR1NMLVMiICYgeWVhciA8IDE5OTIpLGhhdWxfaWRdKQoKRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKGhhdWxfaWQgJWluJSBoYXVsX2lkc190b19yZW1vdmVfR1NMKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqU0dFT1JHKgotIEZyb20gTWFydGluIENvbGxpbnMsICJNb3N0IHN1cnZleXMgd2VyZSBmb2N1c2VkIG9uIGRlbWVyc2FsIGZpc2ggb24gdGhlIFNvdXRoIEdlb3JnaWEgc2hlbGYgKDwgMzUwIG0pLCBidXQgc3VydmV5cyBpbiAyMDAzLCAyMDEwIGFuZCAyMDE5IGhhZCBzb21lIGRlZXBlciB0cmF3bHMuICBUaGUgZGVlcGVyIHRyYXdscyBjYXVnaHQgdmVyeSBkaWZmZXJlbnQgZmlzaCwgc28gYXJlIHVubGlrZWx5IHRvIGJlIG9mIHVzZSB0byBhIGxvbmctdGVybSBhbmFseXNpcywgYnV0IEkgaGF2ZSBsZWZ0IHRoZW0gaW4uIgoKLURlbGV0ZSBhbGwgdHJhd2xzIGRlZXBlciB0aGFuIDM1MCBNCmBgYHtyfQojaWRlbnRpZnkgaGF1bF9pZHMgb2YgaGF1bHMgd2Ugc2hvdWxkIHJlbW92ZSBmcm9tIEdTTCBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9TR0VPUkcgPC0gdW5pcXVlKEZpc2hHbG9iXzEuNVsoc3VydmV5ID09ICJTR0VPUkciICYgZGVwdGggPjM1MCksaGF1bF9pZF0pCgpGaXNoR2xvYl8xLjUgPC0gRmlzaEdsb2JfMS41WyEoaGF1bF9pZCAlaW4lIGhhdWxfaWRzX3RvX3JlbW92ZV9TR0VPUkcpLF0gI3JlbW92ZSBoYXVscyBiZWZvcmUgY29uc2lzdGVudCBnZWFyL3Zlc3NlbCB3YXMgdXNlZApgYGAKCipOWi1DSEFUKgotYnVtcCBkZWNlbWJlciBvYnNlcnZhdGlvbnMgdG8gbmV4dCB5ZWFyIGJlY2F1c2Ugb2JzZXJ2YXRpb25zIG9jY3VyIGluIDEyLDEsMgpgYGB7cn0KI2J1bXAgb2JzZXJ2YXRpb25zIGZvcndhcmQKRmlzaEdsb2JfMS41W3N1cnZleSA9PSAiTlotQ0hBVCIgJiBtb250aCA9PSAxMiwgIHllYXIgOj0geWVhcisxLCBdCmBgYAoKCiMjI0JlY2F1c2UgdGltZSBpcyBhbiBlc3NlbnRpYWwgY29tcG9uZW50IG9mIHRoZXNlIGFuYWx5c2VzLCB3ZSB3aWxsIGdldCByaWQgb2YgYW55IHN1cnZleSB4IHNlYXNvbiBjb21iaW5hdGlvbnMgdGhhdCBhcmUgbm90IHNhbXBsZWQgZm9yIGF0IGxlYXN0IDEwIHllYXJzCgpgYGB7ciBzdW1tYXJ5IGJ5IHN1cnZleSByZWdpb259CiNuZXcgcm93IGZvciB0b3RhbCBudW1iZXIgb2YgeWVhcnMgc2FtcGxlZApGaXNoR2xvYl8xLjVbLHllYXJzX3NhbXBsZWQgOj0gbGVuZ3RoKHVuaXF1ZSh5ZWFyKSksLihzdXJ2ZXlfdW5pdCldCgpzdW1tYXJ5KEZpc2hHbG9iXzEuNSR5ZWFyc19zYW1wbGVkKSAjcmFuZ2VzIGZyb20gMiAoREZPIFN0cmFpZ2h0IG9mIEdlb3JnaWEpIHRvIDU3IChOb3J0aGVhc3QgVVMpClZpZXcodW5pcXVlKEZpc2hHbG9iXzEuNVssLihzdXJ2ZXlfdW5pdCwgeWVhcnNfc2FtcGxlZCldKSkKCiNzdGF0aXN0aWNzIGFib3V0IGZ1bGwgZGF0YXNldApucm93KEZpc2hHbG9iXzEuNSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2JfMS41WyxzdXJ2ZXldKSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2JfMS41WyxzdXJ2ZXlfdW5pdF0pKSAKCiNyZW1vdmUgb2JzZXJ2YXRpb25zIGZvciBhbnkgcmVnaW9ucyB4IHNlYXNvbiBjb21iaW5hdGlvbnMgc2FtcGxlZCBsZXNzIHRoYW4gMTAgdGltZXMKRmlzaEdsb2IuMTB5ZWFyIDwtIEZpc2hHbG9iXzEuNVt5ZWFyc19zYW1wbGVkID49IDEwLF0KCiNzdGF0aXN0aWNzIGFib3V0IHJlZHVjZWQgMTAgeWVhciBkYXRhc2V0Cm5yb3coRmlzaEdsb2IuMTB5ZWFyKSAKbGVuZ3RoKHVuaXF1ZShGaXNoR2xvYi4xMHllYXJbLHN1cnZleV0pKSAKbGVuZ3RoKHVuaXF1ZShGaXNoR2xvYi4xMHllYXJbLGFzLmNoYXJhY3RlcihzdXJ2ZXlfdW5pdCldKSkgCgojcmVtb3ZlIGZ1bGwgZGF0YWJhc2UKcm0oRmlzaEdsb2JfMS41KQoKCmBgYAoKIyMjRm9yIHRheG9ub21pYyBhbmFseXNlcywgcmVzb2x1dGlvbiB0byBzcGVjaWVzIGlzIHJlcXVpcmVkLiBUaGVyZWZvcmUsIHdlIHdpbGwgIGV4Y2x1ZGUgYW55IG9ic2VydmF0aW9ucyBub3QgcmVzb2x2ZWQgdG8gc3BlY2llcy4gCgpgYGB7ciBzcHAgSUQgb25seX0KI21vbnRoIGEgbnVtYmVyCkZpc2hHbG9iLjEweWVhclssbW9udGggOj0gYXMubnVtZXJpYyhtb250aCldCgpGaXNoR2xvYi4xMHllYXIuc3BwIDwtIEZpc2hHbG9iLjEweWVhcltyYW5rICVpbiUgYygiU3BlY2llcyIsICJTdWJzcGVjaWVzIiksXSAjMzg2OTM4NCB0b3RhbCBvYnNlcnZhdGlvbnMKCiNyZW1vdmUgZnVsbCBzcGVjaWVzIGRhdGFiYXNlCnJtKEZpc2hHbG9iLjEweWVhcikKCiN2ZWN0b3Igd2l0aCBhbGwgc3VydmV5IG5hbWVzCmFsbF9zdXJ2ZXlfdW5pdHMgPC0gc29ydCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcFssc3VydmV5X3VuaXRdKSkKCiNjYWxjdWxhdGUgIyBzcGVjaWVzIHBlciB5ZWFyCkZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLC4oc3VydmV5X3VuaXQsIHllYXIsIGFjY2VwdGVkX25hbWUpXSkKCkZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXJbLHNwcF9jb3VudF9zdXJ2ZXlfeWVhciA6PSB1bmlxdWVOKGFjY2VwdGVkX25hbWUpLC4oc3VydmV5X3VuaXQsIHllYXIpXQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yIDwtdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXJbLC4oc3VydmV5X3VuaXQsICB5ZWFyLCBzcHBfY291bnRfc3VydmV5X3llYXIpXSkKCm5yb3coRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yKQoKI2NhbGN1bGF0ZSAjIGhhdWxzIHBlciB5ZWFyCkZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBbLC4oc3VydmV5X3VuaXQsIHllYXIsIGhhdWxfaWQpXSkKCkZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXJbLGhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhciA6PSB1bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5X3VuaXQsIHllYXIpXQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yIDwtdW5pcXVlKEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXJbLC4oc3VydmV5X3VuaXQsICB5ZWFyLCBoYXVsaWRfY291bnRfc3VydmV5X3llYXIpXSkKCm5yb3coRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yKQoKYGBgCgoKIyNWaXN1YWxseSBJbnNwZWN0IERpc3RyaWJ1dGlvbiBvZiBEYXRhIFRocm91Z2ggVGltZSBhbmQgU3BhY2UKCiMjU3BhdGlhbCBhbmQgVGVtcG9yYWwgUGF0dGVybnMgaW4gQWxsIFRyYXdsIFN1cnZleXMKCkxldCdzIGxvb2sgYXQgdGhlIG51bWJlciBvZiBoYXVscyBwZXIgeWVhci9tb250aCBhbmQgeWVhci9xdWFydGVyIGFuZCB5ZWFyL3NlYXNvbiB2aXN1YWxseQoKYGBge3IgaGF1bHMgcGVyIHllYXIsIG1vbnRoLCBxdWFydGVyfQojdW5pcXVlIHN1cnZleSwgc3VydmV5X3VuaXQsIHllYXIsIG1vbnRoLCBxdWFydGVyLCBzZWFzb24sIGhhdWxfaWQsIGxhdCwgbG9uCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscyA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcFssLihzdXJ2ZXksIHN1cnZleV91bml0LCB5ZWFyLG1vbnRoLHF1YXJ0ZXIsc2Vhc29uLGhhdWxfaWQsIGxhdGl0dWRlLCBsb25naXR1ZGUsaGF1bF9kdXIpXSkKCiNhZGQgY29sdW1uIHdpdGggYWRqdXN0ZWQgbG9uZ2l0dWRlIGZvciBmZXcgc3VydmV5cyB0aGF0IGNyb3NzIGRhdGVsaW5lIChOWi1DSEFUIGFuZCBBSSkKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWyxsb25naXR1ZGVfYWRqIDo9IGlmZWxzZSgoc3VydmV5X3VuaXQgJWluJSBjKCJBSSIsIk5aLUNIQVQiKSAmIGxvbmdpdHVkZSA+IDApLGxvbmdpdHVkZS0zNjAsbG9uZ2l0dWRlKV0KCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssaGF1bF9jb3VudHNfcGVyX3N1cnZleV9zZWFzb25fbW9udGggOj11bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5LCBtb250aCwgc2Vhc29uKV1bLCAjY291bnQgIyBoYXVscyBwZXIgc3VydmV5LCBzZWFzb24sIGFuZCBtb250aAogICAgICAgICAgICAgICAgICAgICBoYXVsX2NvdW50c19wZXJfc3VydmV5X3F1YXJ0ZXJfbW9udGggOj11bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5LCBtb250aCwgcXVhcnRlcildWywjY291bnQgIyBoYXVscyBwZXIgc3VydmV5LCBtb250aCwgYW5kIHF1YXJ0ZXIKICAgICAgICAgICAgICAgICAgICAgdG90YWxfaGF1bHNfc3VydmV5IDo9dW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleSldWywjY291bnQgIyBoYXVscyBwZXIgc3VydmV5IGluIGFsbCB5ZWFycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSwgc2Vhc29uLCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIG92ZXIgYWxsIHllYXJzCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uIDo9aGF1bF9jb3VudHNfcGVyX3N1cnZleV9zZWFzb25fbW9udGgvdG90YWxfaGF1bHNfc3VydmV5XVssCiAgICAgICAgICAgICAgI3Byb3BvcnRpb24gb2YgaGF1bHMgZm9yIGVhY2ggc3VydmV5LCBxdWFydGVyLCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIG92ZXIgYWxsIHllYXJzCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciA6PWhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfcXVhcnRlcl9tb250aC90b3RhbF9oYXVsc19zdXJ2ZXldWywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX21vbnRoIDo9dW5pcXVlTihoYXVsX2lkKSwuKHllYXIsIHN1cnZleV91bml0LCBtb250aCldWywgI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSB1bml0LCB5ZWFyLCBhbmQgbW9udGgKICAgICAgICAgICAgICAgICAgICAgdG90YWxfaGF1bHNfc3VydmV5X3llYXIgOj0gdW5pcXVlTihoYXVsX2lkKSwuKHN1cnZleV91bml0LHllYXIpXVssICNjb3VudCB0b3RhbCAjIGhhdWxzIHBlciBzdXJ2ZXkgdW5pdCBhbmQgeWVhcgogICAgICAgICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXkgdW5pdCBhbmQgbW9udGggZGl2aWRlZCBieSB0b3RhbCAjIGhhdWxzIHdpdGhpbiBhIHN1cnZleSB1bml0IHdpdGhpbiBhIHllYXIKICAgICAgICAgICAgICAgICAgICAgaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSA6PSBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9tb250aC90b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcl1bLCAKCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX3F1YXJ0ZXIgOj11bmlxdWVOKGhhdWxfaWQpLC4oeWVhciwgc3VydmV5X3VuaXQsIHF1YXJ0ZXIpXVssICNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXkgdW5pdCwgeWVhciwgYW5kIG1vbnRoCiAgICAgICAgICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSB1bml0IGFuZCBtb250aCBkaXZpZGVkIGJ5IHRvdGFsICMgaGF1bHMgd2l0aGluIGEgc3VydmV5IHVuaXQgd2l0aGluIGEgeWVhcgogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkgOj0gaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfcXVhcnRlci90b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcl0gCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LCBzdXJ2ZXlfdW5pdCwgbW9udGgsIHNlYXNvbiwgaGF1bF9jb3VudHNfcGVyX3N1cnZleV9zZWFzb25fbW9udGgsdG90YWxfaGF1bHNfc3VydmV5LCBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbildKSAjcmVsYXRpdmUgc2FtcGxpbmcgYnkgc2Vhc29uIGFjcm9zcyBhbGwgeWVhcnMKCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LHN1cnZleV91bml0ICwgbW9udGgsIHF1YXJ0ZXIsIGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfcXVhcnRlcl9tb250aCx0b3RhbF9oYXVsc19zdXJ2ZXksIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlcildKSAjcmVsYXRpdmUgc2FtcGxpbmcgYnkgcXVhcnRlciBhY3Jvc3MgYWxsIHllYXJzCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LCB5ZWFyLCBzdXJ2ZXlfdW5pdCwgbW9udGgsIGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX21vbnRoLHRvdGFsX2hhdWxzX3N1cnZleV95ZWFyLGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IG1vbnRoIHdpdGhpbiB5ZWFycwoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLC4oc3VydmV5LCB5ZWFyLCBzdXJ2ZXlfdW5pdCwgcXVhcnRlciwgaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfcXVhcnRlcix0b3RhbF9oYXVsc19zdXJ2ZXlfeWVhcixoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpXSkgI3JlbGF0aXZlIHNhbXBsaW5nIGJ5IG1vbnRoIHdpdGhpbiB5ZWFycwoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggc2Vhc29uIGFuZCBtb250aD8Kc3VydmV5X3NlYXNvbl9tb250aF9oYXVscyA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbikgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIGZhY2V0X3dyYXAofnN1cnZleSxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHN1cnZleV9zZWFzb25fbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInN1cnZleV9zZWFzb25fbW9udGhfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDE1LCB1bml0cyA9ICJpbiIpCgojaG93IGRvZXMgI2hhdWxzIHZhcnkgd2l0aCBxdWFydGVyIGFuZCBtb250aD8Kc3VydmV5X3F1YXJ0ZXJfbW9udGhfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5LHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoc3VydmV5X3F1YXJ0ZXJfbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInN1cnZleV9xdWFydGVyX21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gNSwgd2lkdGggPSAxNSwgdW5pdHMgPSAiaW4iKQoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggeWVhciBhbmQgbW9udGg/CnllYXJfc3VydmV5X21vbnRoX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoeWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQpnZ3NhdmUoeWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X21vbnRoX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQoKI2hvdyBkb2VzICNoYXVscyB2YXJ5IHdpdGggeWVhciBhbmQgbW9udGg/CnllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcikgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCxzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKHllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDE2LCB1bml0cyA9ICJpbiIpCmdnc2F2ZSh5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLCBmaWxlbmFtZSA9ICJ5ZWFyX3N1cnZleV9xdWFydGVyX2hhdWxzLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxNiwgdW5pdHMgPSAiaW4iKQpgYGAKCk5vdywgbGV0J3MgbG9vayBhdCBob3cgbG9jYXRpb24gb2Ygc2FtcGxpbmcgdmFyaWVzIGJ5IG1vbnRoIG9mIHNhbXBsaW5nIGFuZCB5ZWFyIG9mIHNhbXBsaW5nIAoKYGBge3IgbG9jYXRpb24gYnkgeWVhciBwbG90c30KbG9jYXRpb25fYnlfeWVhciA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZShsb2NhdGlvbl9ieV95ZWFyLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV95ZWFyLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X3llYXIsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X3llYXIuanBnIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUobG9jYXRpb25fYnlfeWVhciwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfeWVhci5lcHMiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKYGBgCgoKYGBge3IgbG9jYXRpb24gYnkgbW9udGggcGxvdHN9Cihsb2NhdGlvbl9ieV9tb250aCA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBhcy5udW1lcmljKG1vbnRoKSksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9jbGFzc2ljKCkpCgpnZ3NhdmUobG9jYXRpb25fYnlfbW9udGgsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X21vbnRoLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X21vbnRoLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV9tb250aC5qcGciLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV9tb250aCwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfbW9udGguZXBzIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCmBgYAoKCiMjUmVnaW9uIFNwZWNpZmljIERhdGEgUHJvY2Vzc2luZwoKLUZyZWRzdG9uIGV0IGFsLiAyMDIyIE5hdHVyZSBhbmQgQmF0dCBldCBhbC4gMjAxNyBFY29sb2d5IExldHRlcnMgaW5mb3JtZWQgTm9ydGggQW1lcmljYW4gZGF0YSBwcm9jZXNzaW5nCi1QZXJzb25hbCBjb21tdW5pY2F0aW9uIHdpdGggQXVyb3JlIE1hdXJlYXVkIGFuZCBMYXVyZW5lIFBlY3VjaGV0IHJlOiB3b3JrIGJ5IEEuIE1hdXJlYXVkLCBMLiBQZWN1Y2hldCBhbmQgUi4gRnJlbGF0IGFuZCB0aGUgc3VwcGxlbWVudGFyeSBtYXRlcmlhbCBmb3IgTWF1cmVhdWQgZXQgYWwuIDIwMTkgUHJvY2VlZGluZ3Mgb2YgdGhlIFJveWFsIFNvY2lldHkgQjogQmlvbG9naWNhbCBTY2llbmNlcyBpbmZvcm1lZCBFdXJvcGVhbiBkYXRhIHByb2Nlc3NpbmcKLUFkZGl0aW9uYWwgZGF0YSBwcm9jZXNzaW5nIGluZm9ybWVkIGJ5IGRhdGEgaXRzZWxmLCBhbmQgYnkgRmlzaEdsb2IgcGRmIHN1bW1hcnkgZG9jdW1lbnRzCi1saW1pdCB0byBtYXggMyBtb250aHMgZm9yIGVhY2ggc3VydmV5IHVuaXQsIHJlcHJlc2VudGF0aXZlIG9mIGEgJ3NlYXNvbicgKGV4Y2VwdGlvbiA9IFdlc3QgQ29hc3QgVVNBIHdoZXJlIGFsbCA0IG1vbnRocyBzYW1wbGVkIGNvbnNpc3RlbnRseSkKCiMjIyMiQUkiCmBgYHtyIEFJIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5ID09ICJBSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJBSSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQUkiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotIE1vc3QgaGF1bHMgaW4gNiw3LDgKLSBTZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLSBObyBkcmFtYXRpYyBjaGFuZ2VzIGluIHNwcCByaWNobmVzcyAKYGBge3IgQUkgcHJvY2Vzc2luZ30KYWlfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJBSSIgJiBtb250aCAlaW4lIGMoNjo4KSxoYXVsX2lkXSkKYGBgCgoKIyMjI0JJVFMKKFdlIGhhdmUgdHdvIHN1cnZleXMgZm9yIEJJVFMsIHF1YXJ0ZXIgMSBhbmQgcXVhcnRlciA0KQpCSVRTIDEKCkZyb20gRnJlZHN0b24gZXQgYWwuIDIwMjMsIGV2ZXJ5IHllYXIgYWZ0ZXIgMjAwMCBoYXMgPjQwMCBoYXVscyBhbmQgbW9zdCBvZiB0aGUgZWFybGllciB5ZWFycyBhcmUgPDUwIAoKYGBge3IgIEJJVFMxIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkJJVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCi1LZWVwIGJvdGggbW9udGhzICgyLDMpCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUNvbnNpc3RlbnQgIyBvZiBzcGVjaWVzIGFuZCAjIGhhdWxzIGFmdGVyIDIwMDAKYGBge3IgQklUUzEgcHJvY2Vzc2luZ30KYml0czFfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTEiICYgbW9udGggJWluJSBjKDIsMykgJiB5ZWFyID4gMjAwMCxoYXVsX2lkXSkKYGBgCgpCSVRTNApgYGB7ciAgQklUUzQgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCi1LZWVwICgxMCwxMSwxMikKLVN0YXJ0IGluIDIwMDAgKHN0YXJ0cyBpbiAxOTk2LCBidXQgZ2FwIGluIDE5OTcgYW5kIDE5OTgsIGFuZCAxOTk2IGFsbCBpbiBEZWNlbWJlcjsgYWxzbyBzcHAgcmljaG5lc3MgaW4gZmlyc3Qgc3VydmV5IHZlcnkgbG93OyBjb25zaXN0ZW50ICMgb2YgaGF1bHMgYWZ0ZXIgMjAwMCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQoKYGBge3IgQklUUzQgcHJvY2Vzc2luZ30KYml0czRfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiICYgbW9udGggJWluJSBjKDEwOjEyKSAmIHllYXIgPiAyMDAwLGhhdWxfaWRdKQpgYGAKCgojIyMjQ0hMIChDaGlsZSkKCmBgYHtyICBDSEwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiQ0hMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQ0hMIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLUtlZXAgKDcsOCw5KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIHNwcCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gIyBoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIENITCBwcm9jZXNzaW5nfQpjaGxfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiICYgbW9udGggJWluJSBjKDc6OSksaGF1bF9pZF0pCmBgYAoKCgojIyMjREZPLU5GCgoKYGBge3IgIERGTy1ORiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJERk8tTkYiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tTkYiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgKDEwLDExLDEyKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIHNwcCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gaGF1bGlkIHRocm91Z2ggdGltZQoKYGBge3IgREZPLU5GIHByb2Nlc3Npbmd9CmRmb19uZl9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIgJiBtb250aCAlaW4lIGMoMTA6MTIpLGhhdWxfaWRdKQpgYGAKCgojIyMjREZPLVFDUwoKYGBge3IgIERGTy1RQ1MgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotS2VlcCAoNyw4KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIHJpY2huZXNzIG92ZXIgdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiAjaGF1bHMKCmBgYHtyIERGTy1RQ1MgcHJvY2Vzc2luZ30KZGZvX3Fjc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiICYgbW9udGggJWluJSBjKDcsOCksaGF1bF9pZF0pCmBgYAoKCgojIyMjRUJTCgotU2FtcGxpbmcgeWVhcnMgcHJpb3IgdG8gMTk4NCAoZGF0YSBiZWdpbiBpbiAxOTgyKSB3ZXJlIGV4Y2x1ZGVkIGZyb20gYW5hbHlzaXMgZHVlIHRvIGxhcmdlIGFwcGFyZW50IGluY3JlYXNlcyBpbiB0aGUgbnVtYmVyIG9mIHNwZWNpZXMgcmVjb3JkZWQgaW4gdGhlIGZpcnN0IHR3byB5ZWFycy4gKEJhdHQgZXQgYWwuIDIwMTcpCgpgYGB7ciAgRUJTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkVCUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJFQlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkVCUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgotS2VlcCAoNiw3LDgpCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVBlciBCYXR0IGV0IGFsLiAyMDE3LCBsaW1pdCB0byA+PSAxOTg0Ci1ObyBjbGVhciBjaGFuZ2VzICBpbiByaWNobmVzcyB0aHJvdWdoIHRpbWUKLU5vIGNsZWFyIGNoYW5nZXMgaW4gIyBoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIEVCUyBwcm9jZXNzaW5nfQplYnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFQlMiICYgbW9udGggJWluJSBjKDYsNyw4KSAmIHllYXIgPj0gMTk4NCxoYXVsX2lkXSkKYGBgCgoKIyMjI0VWSE9FCgpgYGB7ciAgRVZIT0UgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgKDEwLDExLDEyKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1WZXJ5IGxvdyBzYW1wbGluZyBpbiAyMDE3IChhbmQgYWxzbyBsb3cgcmljaG5lc3MpLCBleGNsdWRlIHRoaXMgeWVhcgoKYGBge3IgRVZIT0UgcHJvY2Vzc2luZ30KZXZob2VfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJFVkhPRSIgJiBtb250aCAlaW4lIGMoMTAsMTEsMTIpICYgeWVhciAhPSAyMDE3ICxoYXVsX2lkXSkKYGBgCgoKIyMjI0ZBTEsgKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKYGBge3IgRkFMSyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAotS2VlcCBGZWJydWFyeSAoMikgb25seSBmcm9tIDIwMDQgb253YXJkIChtb3N0IGNvbnNpc3RlbnQgc2FtcGxpbmcpCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgdGhpcyB3aWxsIGJlIGZpeGVkIGluIG5leHQgc3RlcCB3aXRoIHNwYXRpYWwgc3RhbmRhcmRpemF0aW9uCgoKYGBge3IgRkFMSyBwcm9jZXNzaW5nfQpmYWxrX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIgJiBtb250aCAlaW4lIGMoMikgJiB5ZWFyID49IDIwMDQsIGhhdWxfaWRdKQpgYGAKCgojIyMjRlItQ0dGUwoKYGBge3IgIEZSLUNHRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgOSwxMCwxMQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIHRocm91Z2ggdGltZQotU2VlZW1pbmdseSBjb25zaXN0ZW50ICNoYXVscyB0aHJvdWdoIHRpbWUKCgpgYGB7ciBGUi1DR0ZTIHByb2Nlc3Npbmd9CmZyX2NnZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSwgaGF1bF9pZF0pCmBgYAoKIyMjI0dJTiAoZXhjbHVkZWQgZnJvbSBmaW5hbCBkYXRhc2V0KQoKYGBge3IgIEdJTiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHSU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHSU4iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1FeGNsdWRlIHRoaXMgcmVnaW9uLCBubyBjb25zaXN0ZW50IHNhbXBsaW5nIHRocm91Z2ggdGltZQoKYGBge3IgR0lOIHByb2Nlc3Npbmd9Cmdpbl9oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjR01FWAotSW4gdGhlIEd1bGYgb2YgTWV4aWNvLCB3ZSByZXN0cmljdGVkIG91ciBhbmFseXNpcyB0byBkYXRhIGZyb20gMTk4NCAtIDIwMDAgKGZ1bGwgcmFuZ2UgIDE5ODItMjAxNCk7IGlmIGFsbCB5ZWFycyBoYWQgYmVlbiB1c2VkLCB0aGUgbnVtYmVyIG9mIHNpdGVzIHNhbXBsZWQgaW4gYXQgbGVhc3QgODUlIG9mIHllYXJzICB3b3VsZCBkcm9wIGZyb20gMzkgdG8gMTMuIChCYXR0IGV0IGFsLiAyMDE3KQoKR01FWCBGYWxsIApgYGB7ciAgR01FWCBGYWxsIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdNRVgtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtRmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgOSwxMCwxMQotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgd2lsbCByZXN0cmljdCB0byA8LTg3LjUgbG9uZ2l0dWRlCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCgoKYGBge3IgR01FWC1GYWxsIHByb2Nlc3Npbmd9CmdtZXhfZmFsbF9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdNRVgtRmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiBsb25naXR1ZGVfYWRqIDwgLTg3LjUsIGhhdWxfaWRdKQpgYGAKCkdNRVggU3VtbWVyCmBgYHtyICBHTUVYIFN1bW1lciB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBtb250aHMgNSw2LDcKLUluIGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgdGhpcyB3aWxsIGJlIGZpeGVkIGluIHNwYXRpYWwgc3RhbmRhcmRpemF0aW9uIHN0ZXAKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIGJlZm9yZSAyMDA4IGFuZCAyMDA4IG9ud2FyZCB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCi1KdW1wIGZyb20gMjAwNyB0byAyMDA4LCB3aGVuIHNwYXRpYWwgZm9vdHByaW50IGluY3JlYXNlcywgc28gSSB3aWxsIG9ubHkgdXNlIGRhdGEgZnJvbSBiZWZvcmUgMjAwOAoKYGBge3IgR01FWC1TdW1tZXIgcHJvY2Vzc2luZ30KZ21leF9zdW1tZXJfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIgJiBtb250aCAlaW4lIGMoNSw2LDcpICYgeWVhciA8MjAwOCwgaGF1bF9pZF0pCmBgYAoKIyMjI0dPQQpgYGB7ciBHT0EgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR09BIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR09BIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBtb250aHMgNiw3LDgKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQoKYGBge3IgR09BIHByb2Nlc3Npbmd9CmdvYV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdPQSIgJiBtb250aCAlaW4lIGMoNiw3LDgpLCBoYXVsX2lkXSkKYGBgCgojIyMjR1JMLURFCi1Gcm9tIEJldWtob2YgZXQgYWwuIDIwMTksIGFsbCBzdXJ2ZXlzIGluIE9jdG9iZXIgYW5kIE5vdmVtYmVyCmBgYHtyIEdSTC1ERSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHUkwtREUiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHUkwtREUiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1ObyBtb250aHMgaW4gZGF0YSBzZXQsIGJ1dCBhY2NvcmRpbmcgdG8gQmV1a2hvZiBldCBhbC4gMjAxOSwgYWxsIHNhbXBsaW5nIGluIE9jdG9iZXIgYW5kIE5vdmVtYmVyIHNvIGtlZXAgYWxsIAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi0jIG9mIGhhdWxzIGRyb3BzIGJldHdlZW4gMTk5MSBhbmQgMTk5MiwgYW5kIGJvdGggMTk5MiBhbmQgMjAxNyBzbyBsaW1pdCB0byB5ZWFycyBiZXR3ZWVuICgxOTkzLTIwMTYpCgpgYGB7ciBHUkwtREUgcHJvY2Vzc2luZ30KZ3JsX2RlX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIiAmIHllYXIgJWluJSBjKDE5OTM6MjAxNiksIGhhdWxfaWRdKQpgYGAKCiMjIyNHU0wKCkdTTC1OCmBgYHtyIEdTTC1OIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLSMgb2YgaGF1bHMgaW4gMjAwNSBpcyBoaWdoZXIsIHNvIHN0YXJ0IGluIDIwMDYKCmBgYHtyIEdTTC1OIHByb2Nlc3Npbmd9CmdzbF9uX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iICYgeWVhciA+IDIwMDUsIGhhdWxfaWRdKQpgYGAKCkdTTC1TCmBgYHtyIEdTTC1TIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDgsOSwxMAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIEdTTC1TIHByb2Nlc3Npbmd9CmdzbF9zX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiICYgbW9udGggJWluJSBjKDg6MTApLCBoYXVsX2lkXSkKYGBgCgojIyMjSUNFLUdGUwoKYGBge3IgSUNFLUdGUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMiwzLDQKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBJQ0UtR0ZTIHByb2Nlc3Npbmd9CmljZV9nZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIiAmIG1vbnRoICVpbiUgYygyOjQpLCBoYXVsX2lkXSkKYGBgCgojIyMjSUUtSUdGUwoKYGBge3IgSUUtSUdGUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMTAsMTEsMTIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIGFmdGVyIDIwMDQgKHNhbXBsZWQgZmFyIGVhc3QgaW4gMjAwMyBhbmQgMjAwNCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIElFLUlHRlMgcHJvY2Vzc2luZ30KaWVfaWdmc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiICYgbW9udGggJWluJSBjKDEwOjEyKSAmIHllYXIgID4gMjAwNCwgaGF1bF9pZF0pCmBgYAoKIyMjI0lTLU1PQUcgKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKYGBge3IgSVMtTU9BRyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVNhbXBsaW5nIHRvbyBzY2F0dGVyZWQgb3ZlciB0aW1lLCBleGNsdWRpbmcKCmBgYHtyIElTLU1PQUcgcHJvY2Vzc2luZ30KaXNfbW9hZ19oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjTUVESVRTCmBgYHtyIE1FRElUUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJNRURJVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJNRURJVFMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwICBhbGwgc3VydmV5cyBpbiBxdWFydGVyIDIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBNRURJVFMgcHJvY2Vzc2luZ30KbWVkaXRzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIiwgaGF1bF9pZF0pCmBgYAoKCiMjIyNNUlQgKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKYGBge3IgTVJUIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk1SVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJNUlQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk1SVCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVNhbXBsaW5nIGluY29uc2lzdGVudCwgZXhjbHVkZSBjb21wbGV0ZWx5CgpgYGB7ciBNUlQgcHJvY2Vzc2luZ30KbXJ0X2hhdWxzX2tlZXAgPC0gTlVMTApgYGAKCiMjIyNOQU0KCmBgYHtyIE5BTSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOQU0iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOQU0iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIHN1cnZleXMgaW4gMSBhbmQgMiAobW9zdCBjb25zaXN0ZW50bHkgc2FtcGxlZCkKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBleGNlcHQgZm9yIDE5OTggKGV4Y2x1ZGUpCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMgZXhjZXB0IGZvciAxOTk4IChleGNsdWRlKQoKYGBge3IgTkFNIHByb2Nlc3Npbmd9Cm5hbV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIgJiBtb250aCAlaW4lIGMoMSwyKSAmIHllYXIgIT0gMTk5OCwgaGF1bF9pZF0pCmBgYAoKCiMjIyNORVVTCgoKTkVVUyBTcHJpbmcKYGBge3IgTkVVUy1TcHJpbmcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMyw0LDUgbW9udGhzCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgKGVzcGVjaWFsbHkgYWZ0ZXIgODcsIHNob3VsZCBiZSBmaXhlZCB3aXRoIHN0YW5kYXJkaXphdGlvbiBzdGVwKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIChlc3BlY2lhbGx5IGFmdGVyIDgxLCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKCmBgYHtyIE5FVVMtU3ByaW5nIHByb2Nlc3Npbmd9CiNjYWxjdWxhdGUgd2d0X2NwdWUgKGttXjIgYXZnIGZyb20gc2VhbiBMdWNleSkgYW5kIHdndF9oIChhbGwgYmlvbWFzcyB2YWx1ZXMgY2FsaWJyYXRlZCB0byBzdGFuZGFyZCBwcmUgMjAwOSAzMCBtaW51dGUgdG93KQpGaXNoR2xvYi4xMHllYXIuc3BwW3N1cnZleSA9PSAiTkVVUyIsIHdndF9oIDo9IHdndC8wLjVdW3N1cnZleSA9PSAiTkVVUyIsIHdndF9jcHVlIDo9IHdndC8wLjAzODRdW3N1cnZleSA9PSAiTkVVUyIsIG51bV9oIDo9IG51bS8wLjVdW3N1cnZleSA9PSAiTkVVUyIsIG51bV9jcHVlIDo9IG51bS8wLjAzODRdCgoKI2Fsc28sIGZvciBub3J0aGVhc3QsIHdlIGFyZSBnb2luZyB0byBkZWxldGUgYW55IGhhdWxzIGJlZm9yZSAyMDA5IHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAzMCBtaW51dGVzIGFuZCAyMDA5IGZvcndhcmQgdGhhdCBhcmUgb3V0c2lkZSBvZiArLy0gNSBtaW51dGVzIG9mIDIwIG1pbnV0ZXMKbmV1c19zcHJpbmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWygoc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIiAmIG1vbnRoICVpbiUgYygzOjUpICYgeWVhciA8IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjQyICYgaGF1bF9kdXIgPCAwLjU4KSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciICYgbW9udGggJWluJSBjKDM6NSkgJiB5ZWFyID49IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjI1ICAmIGhhdWxfZHVyIDwgMC40MikpKSwgaGF1bF9pZF0pCgoKYGBgCgpORVVTIEZhbGwKCmBgYHtyIE5FVVMtRmFsbCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJORVVTLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDksMTAsMTEgbW9udGhzCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgKGVzcGVjaWFsbHkgYWZ0ZXIgODQsIHNob3VsZCBiZSBmaXhlZCB3aXRoIHN0YW5kYXJkaXphdGlvbiBzdGVwKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIChlc3BlY2lhbGx5IGFmdGVyIDg1LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKCmBgYHtyIE5FVVMtRmFsbCBwcm9jZXNzaW5nfQoKI2Fsc28sIGZvciBub3J0aGVhc3QsIHdlIGFyZSBnb2luZyB0byBkZWxldGUgYW55IGhhdWxzIGJlZm9yZSAyMDA5IHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAzMCBtaW51dGVzIGFuZCAyMDA5IGZvcndhcmQgdGhhdCBhcmUgb3V0c2lkZSBvZiArLy0gNSBtaW51dGVzIG9mIDIwIG1pbnV0ZXMKbmV1c19mYWxsX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1soKHN1cnZleV91bml0ID09ICJORVVTLUZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgeWVhciA8IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjQyICYgaGF1bF9kdXIgPCAwLjU4KSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSAmIHllYXIgPj0gMjAwOSAmIChoYXVsX2R1ciA+IDAuMjUgICYgaGF1bF9kdXIgPCAwLjQyKSkpLCBoYXVsX2lkXSkKYGBgCgojIyMjTklHRlMKTm9ydGhlcm4gSXJlbGFuZAoKU3ByaW5nIE5vcnRoZXJuIElyZWxhbmQgKHF1YXJ0ZXIgMSkKCmBgYHtyIE5JR0ZTIHNwcmluZyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgMiwzLDQgbW9udGhzCi1JbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTklHRlMgMSBwcm9jZXNzaW5nfQpuaWdmc18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIgJiBtb250aCAlaW4lIGMoMiwzLDQpLCBoYXVsX2lkXSkKYGBgCgoKU3ByaW5nIE5vcnRoZXJuIElyZWxhbmQgKHF1YXJ0ZXIgMSkKCmBgYHtyIE5JR0ZTIGZhbGwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDEwLDExIG1vbnRocwotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIGJ1dCBzaG91bGQgYmUgY2F1Z2h0IGluIHN0YW5kYXJkaXphdGlvbiBzdGVwCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBOSUdGUyA0IHByb2Nlc3Npbmd9Cm5pZ2ZzXzRfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy00IiAmIG1vbnRoICVpbiUgYygxMCwxMSksIGhhdWxfaWRdKQpgYGAKCiMjIyNOb3ItQlRTCgpPRyBGSVNIR0xPQiBpbmNsdWRlcyBOb3ItQlRTLTEgYXMgd2VsbCwgYnV0IHRoaXMgd2FzIG5vdCBzaGFyZWQgYnkgTC4gUGVjdWNoZXQsIGFuZCB0aGVyZWZvcmUgaWdub3JlZAoKTm9yLUJUUy0zCmBgYHtyIE5vci1CVFMtM30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOCw5LDEwCi1Tb21ld2hhdCBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTnVtYmVyIG9mIGhhdWxzIGlzIHZhcmlhYmxlLCBidXQgbm8gY2xlYXIgeWVhcnMgdG8gZXhjbHVkZQotTGF1cmVuZSBQZWN1Y2hldCAoVSBUcm9tc28pIHRvbGQgdXMgdGhhdCBvbmx5IHN1cnZleXMgMjAwNCBhbmQgb253YXJkcyB3b3JrIGZvciBiaW9kaXZlcnNpdHkgYW5hbHlzZXMKCgpgYGB7ciBOb3ItQlRTLTMgcHJvY2Vzc2luZ30Kbm9yX2J0c18zX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIiAmIG1vbnRoICVpbiUgYyg4OjEwKSAmIHllYXIgPj0gMjAwNCwgaGF1bF9pZF0pCmBgYAoKIyMjI05TLUlCVFMKCk5TLUlCVFMtMQpgYGB7ciBOUy1JQlRTLTF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEsMiwzCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTGluZWFyIGluY3JlYXNlIGluIHJpY2huZXNzLCBjdXRvZmYgb24gIyBoYXVscyBtb3JlIGNsZWFyCi1MaW5lYXIgaW5jcmVhc2UsIGJ1dCBzb21ld2hhdCBjbGVhciBicmVhayBiZXR3ZWVuIGxhdGUgNzBzIGFuZCBtaWQtODBzLCBvbmx5IGtlZXAgaGF1bHMgYWZ0ZXIgMTk4NAoKCmBgYHtyIE5TLUlCVFMtMSBwcm9jZXNzaW5nfQpuc19pYnRzXzFfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiICYgbW9udGggJWluJSBjKDE6MykgJiB5ZWFyID49IDE5ODQsIGhhdWxfaWRdKQpgYGAKCk5TLUlCVFMtMwpgYGB7ciBOUy1JQlRTLTN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDcsOCw5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotQ29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLUVhcmx5IHllYXJzIGxvd2VyICMgaGF1bHMsIHdpbGwgc3RhcnQgYXQgMTk5OAoKCmBgYHtyIE5TLUlCVFMtMyBwcm9jZXNzaW5nfQpuc19pYnRzXzNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiICYgbW9udGggJWluJSBjKDc6OSkgJiB5ZWFyID49IDE5OTgsIGhhdWxfaWRdKQpgYGAKCgojIyMjTloKCk5aLUNIQVQKCmBgYHtyIE5aLUNIQVR9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMTIsMSwyIChOT1RFIFRIQVQgVEhJUyBOWi1DSEFUIFNVUlZFWSBDUk9TU0VTIFlFQVIsIFNPIFdFIEFMUkVBRFkgTFVNUEVEIDEyIHdpdGggTkVYVCB5ZWFyKQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMgYWZ0ZXIgMTk5NQoKCmBgYHtyIE5aLUNIQVQgcHJvY2Vzc2luZ30KCgpuel9jaGF0X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIgJiBtb250aCAlaW4lIGMoMTIsMSwyKSAmIHllYXIgPj0gMTk5NSwgaGF1bF9pZF0pCgpgYGAKCk5aLUVDU0kKCmBgYHtyIE5aLUVDU0l9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNCw1LDYKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCi1HYXAgYmV0d2VlbiAxOTk1IGFuZCAyMDA1LCBidXQgd2UgaGF2ZSAxMCB0b3RhbCB5ZWFycyBzbyB3ZSdsbCBrZWVwIGZvciBub3cKCgpgYGB7ciBOWi1FQ1NJIHByb2Nlc3Npbmd9Cm56X2Vjc2lfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIiAmIG1vbnRoICVpbiUgYyg0LDUsNiksIGhhdWxfaWRdKQpgYGAKCk5aLVNVQkEKCmBgYHtyIE5aLVNVQkF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMTEgYW5kIDEyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLUZhciBtb3JlIGhhdWxzIGluIDE5OTBzLCB0aGVzZSBlYXJseSBzYW1wbGluZyB5ZWFycyB3aWxsIGJlIGV4Y2x1ZGVkIChzdGFydCBpbiAyMDAwKQoKCmBgYHtyIE5aLVNVQkEgcHJvY2Vzc2luZ30Kbnpfc3ViYV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiICYgbW9udGggJWluJSBjKDExLDEyKSAmIHllYXIgPj0gMjAwMCwgaGF1bF9pZF0pCmBgYAoKTlotV0NTSQoKYGBge3IgTlotV0NTSX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAzLDQKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotTGluZWFyIGRlY3JlYXNlIGluICMgb2YgaGF1bHMgdGhyb3VnaCB0aW1lLCBsZWF2ZSBvdXQgZmlyc3QgdHdvIHllYXJzIHdpdGggaGlnaGVzdCAjIGhhdWxzICg+PSAxOTk1KQoKCmBgYHtyIE5aLVdDU0kgcHJvY2Vzc2luZ30Kbnpfd2NzaV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiICYgbW9udGggJWluJSBjKDMsNCkgJiB5ZWFyID49IDE5OTUsIGhhdWxfaWRdKQpgYGAKCiMjIyNQVC1JQlRTClBULUlCVFMKYGBge3IgUFQtSUJUU30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA5LDEwLDExCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKCmBgYHtyIFBULUlCVFMgcHJvY2Vzc2luZ30KcHRfaWJ0c19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiICYgbW9udGggJWluJSBjKDksMTAsMTEpLCBoYXVsX2lkXSkKYGBgCgojIyMjUk9DS0FMTAoKYGBge3IgUk9DS0FMTH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA4LDkKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgoKYGBge3IgUk9DS0FMTCBwcm9jZXNzaW5nfQpyb2NrYWxsX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIgJiBtb250aCAlaW4lIGMoOCw5KSwgaGF1bF9pZF0pCmBgYAoKIyMjI1MtR0VPUkcKCmBgYHtyIFMtR0VPUkd9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMSBhbmQgMgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIGV4Y2VwdCBmb3IgMjAwMywgd2lsbCBiZSBleGNsdWRlZAotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzLCBleGNlcHQgZm9yIDIwMTIsIHdpbGwgYmUgZXhjbHVkZWQKCgpgYGB7ciBTR2VvcmdlIHByb2Nlc3Npbmd9CnNfZ2Vvcmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTLUdFT1JHIiAmIG1vbnRoICVpbiUgYygxLDIpICYgISh5ZWFyICVpbiUgYygyMDAzLDIwMTIpKSwgaGF1bF9pZF0pCmBgYAoKIyMjI1NDUwoKU3ByaW5nCmBgYHtyIFNDUy1TUFJJTkd9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMiwzLDQKLUluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUgKG5vcnRoZXJuIGxhdGl0dWRlcyBvbmx5IHNhbXBsZWQgaW4gZWFybHkgeWVhcnMpLCBvbmx5IGluY2x1ZGUgbG9uZ2l0dWRlcyA8IC02MiBhbmQgbGF0aXR1ZGVzIDwgNDUuNQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLU51bWJlciBvZiBoYXVscyBpcyB2YXJpYWJsZSwgZXhjbHVkZSBzdXBlciBsb3cgYW5kIGhpZ2ggbnVtYmVycyAoMTk4NSwxOTk0LDIwMTUsMjAxOSkKCgpgYGB7ciBzY3Nfc3ByaW5nIHByb2Nlc3Npbmd9CnNjc19zcHJpbmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIiAmIG1vbnRoICVpbiUgYygyLDMsNCkgJiAhKHllYXIgJWluJSBjKDE5ODUsMTk5NCwyMDE1LDIwMTkpKSAmIGxvbmdpdHVkZV9hZGogPCAtNjIgJiBsYXRpdHVkZSA8IDQ1LjUsIGhhdWxfaWRdKQpgYGAKClNVTU1FUgpgYGB7ciBTQ1MtU1VNTUVSfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgaW5jcmVhc2VzIGxpbmVhcmx5LCBub3QgYSBjbGVhciBicmVhayBwb2ludCwgdXNpbmcgYnJlYWtwb2ludCBmcm9tICMgb2YgaGF1bHMsIGJ1dCB3aWxsIGV4Y2x1ZGUgMjAxMCB3aGljaCBoYXMgYSB2ZXJ5IGhpZ2ggcmljaG5lc3MKLSMgSGF1bHMgaW5jcmVhc2VzIGxpbmVhcmx5IGZyb20gfjEyMCBpbiAxOTcwIHRvIH4yMjAgaW4gMjAyMCwgbm90IGEgY2xlYXIgYnJlYWtwb2ludCwgYnV0IHdpbGwgZ28gd2l0aCAxOTg2IGJlY2F1c2UgdGhlcmUgaXMgYSBqdW1wIGJldHdlZW4gODUgYW5kIDg2Ci1HZWFyIGNoYW5nZSBpbiAxOTgzIChFbGxpbmdzZW4gZXQgYWwuIDIwMTUpCgoKYGBge3Igc2NzX3N1bW1lciBwcm9jZXNzaW5nfQpzY3Nfc3VtbWVyX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIgJiBtb250aCAlaW4lIGMoNiw3LDgpICYgeWVhciA+PSAxOTg2ICYgeWVhciAhPSAyMDEwLCBoYXVsX2lkXSkKYGBgCgoKIyMjU0VVUwoKClNwcmluZwoKYGBge3IgU0VVUy1zcHJpbmd9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA0LDUsNgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLUNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGxvdyBpbiAxOTg5IGFuZCAyMDE4LCB3aWxsIGV4Y2x1ZGUKCmBgYHtyIHNldXNfc3ByaW5nIHByb2Nlc3Npbmd9CnNldXNfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciICYgbW9udGggJWluJSBjKDQsNSw2KSAmIHllYXIgIT0gMTk4OSAmIHllYXIgIT0gMjAxOCwgaGF1bF9pZF0pCmBgYAoKClN1bW1lcgoKYGBge3IgU0VVUy1zdW1tZXJ9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA3LDgKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBsb3cgaW4gZmlyc3QgeWVhciwgb3RoZXJ3aXNlIG9rYXksIGp1c3QgZXhjbHVkZSBmaXJzdCB5ZWFyICgxOTg5KQoKYGBge3Igc2V1c19zdW1tZXIgcHJvY2Vzc2luZ30Kc2V1c19zdW1tZXJfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIgJiBtb250aCAlaW4lIGMoNyw4KSAmIHllYXIgIT0gMTk4OSwgaGF1bF9pZF0pCmBgYAoKCkZhbGwKCmBgYHtyIFNFVVMtZmFsbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLWZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOSwxMCwxMQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGxvdyBpbiBmaXJzdCB5ZWFyLCBvdGhlcndpc2Ugb2theSwganVzdCBleGNsdWRlIGZpcnN0IHllYXIgKDE5ODkpCgoKYGBge3Igc2V1c19mYWxsIHByb2Nlc3Npbmd9CnNldXNfZmFsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiB5ZWFyICE9IDE5ODksIGhhdWxfaWRdKQpgYGAKCgojIyMjU1dDLUlCVFMKClNjb3RsYW5kIFNoZWxmIFNlYQoKU1dDLUlCVFMgMQoKYGBge3IgU1dDLUlCVFMtMX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxLDIsMwotU29tZXdoYXQgaW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgc2hvdWxkIGJlIGFkZHJlc3NlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBwcm9jZWR1cmUgCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBjb25zaXN0ZW50IGV4Y2VwdCBsb3cgaW4gMTk5NSwganVzdCBleGNsdWRlIDE5OTUKCgoKYGBge3Igc3djLWlidHMtMSBwcm9jZXNzaW5nfQpzd2NfaWJ0c18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIgJiBtb250aCAlaW4lIGMoMSwyLDMpICYgeWVhciAhPSAxOTk1LCBoYXVsX2lkXSkKYGBgCgpTV0MtSUJUUyA0CgpgYGB7ciBTV0MtSUJUUy00fQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEwLDExLDEyCi1Tb21ld2hhdCBpbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIChzb3V0aGVybiBsYXRpdHVkZXMgb25seSBzYW1wbGVkIGluIGVhcmx5IHllYXJzKSwgYnV0IHRoaXMgc2hvdWxkIGJlIGFkZHJlc3NlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBwcm9jZWR1cmUgCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZSAoZXNwZWNpYWxseSBhZnRlciBtaWQgOTBzKQotIyBIYXVscyBjb25zaXN0ZW50IGV4Y2VwdCBsb3cgYmVmb3JlIDE5OTUgYW5kIGxvdyBpbiAyMDEzLCBleGNsdWRlIHRoZXNlCgoKYGBge3Igc3djLWlidHMtNCBwcm9jZXNzaW5nfQpzd2NfaWJ0c180X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIgJiBtb250aCAlaW4lIGMoMTAsMTEsMTIpICYgeWVhciAhPSAxOTk1ICYgeWVhciA+PSAxOTk1LCBoYXVsX2lkXSkKYGBgCgojIyMjV0NBTk4KCgpgYGB7ciBXQ0FOTn0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1IZXJlLCBvbmUgZXhjZXB0aW9uLCB3aWxsIHVzZSBmb3VyIG1vbnRocyAoNiw3LDgsOSkgYmVjYXVzZSBhbGwgc2FtcGxlZCBjb25zaXN0ZW50bHksIGFuZCBsb3dlciBsYXRpdHVkZSBhcmVhcyBzYW1wbGVkIGxhdGVyIGluIHRoZSBzdW1tZXIgY29uc2lzdGVudGx5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKCgpgYGB7ciB3Y2FubiBwcm9jZXNzaW5nfQp3Y2Fubl9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIldDQU5OIiAmIG1vbnRoICVpbiUgYyg2OjkpLCBoYXVsX2lkXSkKYGBgCgojIyMjV0NUUkkKLUV4Y2x1ZGUgYmVjYXVzZSBvbmx5IDEwIHllYXJzIGFuZCBvdmVybGFwcyBzb21ld2hhdCB3aWl0aCBXQ0FOTgoKYGBge3Igd2N0cmkgcHJvY2Vzc2luZ30Kd2N0cmlfa2VlcCA8LSBOVUxMCmBgYAoKCiMjIyNaQUYKCkFUTApgYGB7ciBaQUYgQVRMfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1JbmNsdWRlIDEsMiwzCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUgYWZ0ZXIgMTk5MQoKCmBgYHtyIHphZiBhdGwgcHJvY2Vzc2luZ30KemFmX2F0bF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiICYgbW9udGggJWluJSBjKDE6MykgJiB5ZWFyID49IDE5OTEsIGhhdWxfaWRdKQpgYGAKCgpJTkQKYGBge3IgWkFGIElORH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotSW5jbHVkZSA0LDUsNgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgYmVmb3JlIDIwMDEsIGFuZCB0aGVuIGFsc28gaW4gMjAwNSBhbmQgMjAwOS0yMDEwCgoKYGBge3IgemFmIGluZCBwcm9jZXNzaW5nfQp6YWZfaW5kX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIgJiBtb250aCAlaW4lIGMoNDo2KSAmIHllYXIgJWluJSBjKDE5ODU6MjAwMSwyMDA1LCAyMDA5LDIwMTApLCBoYXVsX2lkXSkKYGBgCgoKIyMjI0NvbWJpbmUgYWxsIGxpc3RzIHRoYXQgaGF2ZSBfa2VlcApgYGB7ciBjb21iaW5lIGxpc3RzfQojYWxsIG9iamVjdHMgd2l0aCBfa2VlcApsaXN0X29iaiA8LSBscyhwYXR0ZXJuID0gIl9rZWVwIikKCiNjb21iaW5lCmZpc2hnbG9iX2hhdWxpZHNfdG9fa2VlcCA8LSB1bmxpc3QobGFwcGx5KGxpc3Rfb2JqLCBnZXQpKSAjMjI5ODk0IGhhdWxzIChTdGFydGVkIHdpdGggMjc4NDA1KQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhbiA8LSBGaXNoR2xvYi4xMHllYXIuc3BwW2hhdWxfaWQgJWluJSBmaXNoZ2xvYl9oYXVsaWRzX3RvX2tlZXAsXQoKI1JlcXVpcmUgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBmb3IgYWxsIG9ic2VydmF0aW9ucwpGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuIDwtIEZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW5bY29tcGxldGUuY2FzZXMoRmlzaEdsb2IuMTB5ZWFyLnNwcF9tYW51YWxjbGVhblssLihsYXRpdHVkZSwgbG9uZ2l0dWRlKV0pXSAjY2hlY2sgdGhhdCB0aGlzIHdvcmtzCgojYW5vdGhlciBjaGVjayBmb3IgIyB5ZWFycyBzYW1wbGVkCiNuZXcgcm93IGZvciB0b3RhbCBudW1iZXIgb2YgeWVhcnMgc2FtcGxlZApGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuWyx5ZWFyc19zYW1wbGVkIDo9IGxlbmd0aCh1bmlxdWUoeWVhcikpLC4oc3VydmV5X3VuaXQpXQpWaWV3KHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuWywuKHN1cnZleV91bml0LCB5ZWFyc19zYW1wbGVkKV0pKQoKI3NhdmUKc2F2ZVJEUyhGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YSIsImNsZWFuZWQiLCJGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuLnJkcyIpKQoKYGBgCgoKIyMjI1NvbWUgc3VydmV5cyBzYW1wbGUgdGhyb3VnaCBlbmQgb2YgeWVhciwgZml4IHRoZXNlCi1OT1RFIFRIQVQgVEhJUyBOWi1DSEFUIFNVUlZFWSBDUk9TU0VTIFlFQVIsIFNPIExVTVAgMSBhbmQgMiB3aXRoIHByZXZpb3VzIHllYXIK